2015-02-01 2 views
1
**exe.py** 
    def createProcess(f): 
     try: 
      from multiprocessing import Process 
      newProcess = Process(target=f) 
      newProcess.start() 
      newProcess.join() 
     except: 
      print "Error creating process" 

    def lala(): 
     print "success creating process" 

    print "tying to make a process" 
    from multiprocessing import Process 
    newProcess = Process(target=lala) 
    newProcess.start() 

    **main.py** 
    if __name__ == '__main__': 
     f = open("exe.py", "r") 
     b = f.read() 
     f.close() 
     o = compile(b, "exe.py", "exec") 
     eval(o) 

я получаю следующую ошибкуначать процесс с Eval

Traceback (most recent call last): 
     File "<string>", line 1, in <module> 
     File "C:\Program Files\Opsware\agent\lcpython15\lib\multiprocessing\forking.p 
    ", line 374, in main 
     self = load(from_parent) 
     File "C:\Program Files\Opsware\agent\lcpython15\lib\pickle.py", line 1378, in 
    load 
     return Unpickler(file).load() 
     File "C:\Program Files\Opsware\agent\lcpython15\lib\pickle.py", line 858, in 
    oad 
     dispatch[key](self) 
     File "C:\Program Files\Opsware\agent\lcpython15\lib\pickle.py", line 1090, in 
    load_global 
     klass = self.find_class(module, name) 
     File "C:\Program Files\Opsware\agent\lcpython15\lib\pickle.py", line 1126, in 
    find_class 
     klass = getattr(mod, name) 
    AttributeError: 'module' object has no attribute 'lala' 

позже редактировать

я изменил exe.py к

def lala2(): 
     f = open("C:\\work\\asdfas", "w") 
     f.write("dsdfg\r\n") 
     f.close() 
     print "success creating process" 

    if __name__ == '__main__': 
     print "tying to make a process" 
     from multiprocessing import Process, freeze_support 
     freeze_support() 
     import pickle 
     l = pickle.dumps(lala2) 
     pickle.loads(l)() 
     newProcess = Process(target=pickle.loads(l)) 
     newProcess.daemon = True 
     newProcess.start() 
     if newProcess.is_alive() == True: 
      print "alive" 
     else: 
      print "not alive" 
     import time 
     time.sleep(12) 

это должно сделать его ввозу и потому теста рассола показывает, что мой метод подбирается. любые предложения о том, почему он ведет себя таким образом?

+0

Почему бы просто не использовать подпроцесс для запуска файла .py? –

+0

на данный момент я ограничен использованием eval. –

ответ

2

Вы находитесь в Windows. К сожалению, в Windows невозможно использовать объект динамического кода в качестве цели для multiprocessing, потому что реализация многопроцессорности Windows должна иметь возможность импортировать основной модуль (техническая причина в том, что Windows не имеет собственного эквивалента fork()). Дополнительную информацию о применимых ограничениях см. В разделе multiprocessing programming guidelines for Windows.

Решение состоит в том, чтобы написать код в файл, затем import его запустить сервер.

+0

считают, что exe.py является плагином, и на данный момент я должен использовать eval. это должно работать как с unix/windows. Как бы вы это сделали? –

+0

поэтому добавление, если __name__ == '__main__': к моему exe.py для создания процесса не решает проблему, хотя это импортируется как модуль –

Смежные вопросы