2016-05-20 4 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

Я не знаю, как исправить вашу ошибку травления, но если вы хотите посмотреть каталог, вы можете подумать об этом через другой скрипт и многократно проверять вывод os.listdir() для изменений файла. Он менее эффективен, но проще, если ваш случай использования достаточно прост. – Ben

ответ

1

Почему бы вам не попробовать Inotify? Это может помочь вам: https://pypi.python.org/pypi/inotify

+0

В результате я сменил свой сценарий на использование PYINotify, и он работает. Благодаря! – gleb1783

0

Я уверен, что он терпит неудачу, потому что dill (который pathos использует) не знает, как мариновать Struct. Это один из немногих объектов, которые я не думаю, что dill может обрабатывать, поскольку он не определен там, где он живет в пространстве имен ... см.: https://github.com/python/typeshed/issues/24.