2016-05-20 16 views
0

Ich schreibe Dateien (in einem sehr schnellen Tempo) in ein bestimmtes Verzeichnis. Ich möchte das Verzeichnis nach neuen Dateien überwachen und dann einen Prozess erstellen, der ein externes Skript ausführt. Gerade jetzt, ich bin immer ein Beiz- Fehler (obwohl ich bin mit Pathos) vonPython Watchdog spawn multiprocessing

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

Ich brauche Hilfe die Beize Fehler Festsetzung der mich dazu führen kann, müssen überdenken, was ich tue, was in Ordnung ist.

Hier ist, was ich bisher:

#!/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

Ich weiß nicht, wie Sie Ihren Beizfehler beheben können, aber wenn Sie ein Verzeichnis ansehen möchten, können Sie es über ein anderes Skript durchführen und die Ausgabe von os.listdir() auf Dateiänderungen überprüfen. Es ist weniger effizient, aber einfacher, wenn Ihr Anwendungsfall einfach genug ist. – Ben

Antwort

0

Ich bin ziemlich sicher, dass es scheitern, weil dill (welche pathos Verwendungen) nicht weiß, wie ein Struct beizen. Es ist eines der wenigen Objekte, von denen ich nicht glaube, dass es dill derzeit verarbeiten kann, da es nicht definiert ist, wo es im Namensraum lebt ... siehe: https://github.com/python/typeshed/issues/24.