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) 

나는 다음과 같은 오류를평가와 프로세스를 시작

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' 

나중에 내가

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) 

에 exe.py을 변경

편집이 그것을 가져올 수 있도록 때문에해야 얻을 피클 테스트에서 내 방법이 선택 가능하다는 것을 보여줍니다. 이런 식으로 행동하는 이유에 대한 제안?

+0

왜 하위 프로세스를 사용하여 .py 파일을 실행하지 않는가? –

+0

내가 eval을 사용하여 제한되는 순간입니다. –

답변

2

Windows를 사용 중입니다. 불행히도 Windows에서는 다중 처리의 Windows 구현이 주 모듈을 가져올 수 있어야하므로 multiprocessing의 대상으로 동적 코드 객체를 사용할 수 없습니다. 기술적 인 이유는 Windows에 기본 글꼴이 fork()에 해당하지 않기 때문입니다. 해당 제한 사항에 대한 자세한 내용은 multiprocessing programming guidelines for Windows을 참조하십시오.

해결책은 파일을 코드로 작성한 다음 import 코드를 작성하여 서버를 시작하는 것입니다.

+0

은 exe.py가 플러그인이고 현재는 eval을 사용해야한다고 생각합니다. 이것은 유닉스/윈도우 모두에서 작동해야합니다. 어떻게 할 건데? –

+0

그래서 __name__ == '__main__'을 추가하면 프로세스 생성을위한 exe.py에서 모듈로 가져올 수 있지만 문제가 해결되지 않습니다. –

관련 문제