2016-05-20 18 views
0

私はファイルを(本当に速いペースで)特定のディレクトリに書き出しています。私は新しいファイルのディレクトリを監視し、外部スクリプトを実行するプロセスを起動したいと思います。今、私はPython Watchdog spawn multiprocessing

Can't pickle <type 'Struct'>: it's not found as __builtin__.Struct 

の(私はパトスを使用していても)酸洗エラーを取得しています私は私は大丈夫である、私がやっているものを再考する必要がありますする可能性があり、酸洗いエラーを修正助けが必要です。ここで

は、私がこれまで持っているものです。

#!/usr/bin/python 

import os 
import sys 
import argparse 
import json 
import time 
import os 
from datetime import datetime 
#Test for Pathos 
from pathos.multiprocessing import ProcessingPool as Pool 
from multiprocessing import cpu_count 
from subprocess import check_output 
import ConfigParser 
import logging 
#WatchDog 
from watchdog.observers import Observer 
from watchdog.events import FileSystemEventHandler, FileSystemMovedEvent 

from CodernityDB.database import Database 

### 
# CONFIGURATION 
### 

CONFIG GOES HERE BUT REMOVED 

### 
# Custom handler for Python Watchdog 
# When spawned, it will spawn a new worker into the pool 
### 
class MyHandler(FileSystemEventHandler): 
     def __init__(self): 
       self.db = Database("/var/db/test.db") 
       try: 
         self.db.open() 
       except Exception, e: 
         print str(e) 
         self.db.create() 

     def on_created(self, event): 
       #print event.src_path 
       try: 
         pool.map(doIt, (self.db, event.src_path,)) 
       except Exception, e: 
         print str(e) 

def codernityIt(db, json_): 
     try: 
       print json_ 
       db.insert(json_) 
     except Exception, e: 
       print str(e) 
       logging.error(str(e)) 

def doIt(db, file_): 
     try: 
       codernityIt(db, json.loads(check_output(['python', '/external/script.py', file_]))) 
     except Exception, e: 
       print str(e) 
       logging.error(str(e)) 

if __name__ == '__main__': 
     ### 
     # Pool specific Settings 
     ### 
     pool = Pool(processes=cpu_count()) 
     event_handler = MyHandler() 
     ### 
     # Watchdog specific settings 
     ### 
     observer = Observer() 
     observer.schedule(event_handler, path=watchPath, recursive=True) 
     observer.start() 

     ### 
     # This While True loop listens for Keyboard interrupts and will gracefully exit the program if found 
     ### 
     try: 
       while True: 
         time.sleep(1) 
     except KeyboardInterrupt: 
       observer.unschedule_all() 
       observer.stop() 
       db.close() 
     #observer.join() 
+0

私はpicklingエラーを修正する方法はわかりませんが、ディレクトリを見たい場合は、別のスクリプトを実行して、os.listdir()の出力を繰り返してファイルの変更を確認してください。それはあまり効率的ではありませんが、ユースケースが十分単純な場合は簡単です。 – Ben

答えて

1

は、なぜあなたはinotifyをしようとしないのですか? それはあなたを助けるかもしれない:https://pypi.python.org/pypi/inotify

+0

私はPYINotifyを使うためにスクリプトを変更してしまいました。ありがとう! – gleb1783

0

dill(これpathos用途は)Structを酸洗する方法を知らないので、私はそれが失敗だとかなり確信しています。私がdillが現在扱うことができるとは思っていないいくつかのオブジェクトの1つです。名前空間にどこに存在するのかは定義されていません。参照:https://github.com/python/typeshed/issues/24

関連する問題