2014-09-25 3 views
4

필자는 원래 Windows 용으로 포팅하려는 Python 프로그램을 Linux 용으로 작성했습니다. 모든 의존성을 포함하는 가상 환경에서 프로그램을 실행 중입니다. (필자 프로그램은 pip 설치로 휠로 설치됩니다. --find-links wheels my_module). 이 프로그램은 제공되는 인수로 해석대로 base_module 내 모듈을로드Python, Windows 및 Multiprocessing

(venv) C:\>venv\Scripts\python.exe -m base_module.Launcher arg1 arg2 

으로 시작하고, 그의 관련 코드입니다 : 이것은 리눅스에서 잘 근무하고있다

from multiprocessing.managers import SyncManager 
import OtherCustomClass 

class BaseModule(object): 
    def __init__(self, arg1, arg2): 
     self.manager = SyncManager() 
     self.manager.start(ignore_interrupt) 

def main(argv=None): 
    ret = -1 
    try: 
     basmod = BaseModule(argv[0], argv[1]) 
     ret = basmod.run() 
    except Exception, err: 
     print("error: " + str(err)) 
     print(traceback.format_exc()) 
    return ret 

if __name__ == "__main__": 
    exitCode = main(sys.argv[1:]) 
    sys.exit(exitCode) 

하지만 Windows에서 내가 얻을 다음과 같은 예외 : 후자는 EOFError가 참 오류가 OtherC 가져올 수 없습니다되고있는 SyncManager에있는 포크 (fork)에서 예기치 않은 조기 종료로 인해 발생

Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
    File "C:\Python27\Lib\multiprocessing\forking.py", line 380, in main 
     prepare(preparation_data) 
    File "C:\Python27\Lib\multiprocessing\forking.py", line 505, in prepare 
     '__parents_main__', file, path_name, etc 
    File "build/bdist.linux-x86_64/egg/base_module/BaseModule.py", line 2, in <module> 
ImportError: No module named OtherCustomClass 
exception in main: 
Traceback (most recent call last): 
    File "build/bdist.linux-x86_64/egg/base_module/BaseModule.py", line 12, in main 
    File "build/bdist.linux-x86_64/egg/base_module/BaseModule.py", line 7, in __init__ 
    File "C:\Python27\Lib\multiprocessing\managers.py", line 528, in start 
     self._address = reader.recv() 
EOFError 

ustomClass. OtherCustomClass가 venv/lib/site-packages 내의 base_module의 폴더에 있음을 확인했습니다.이 오류는 Python이 main() 또는 의 지침에 결코 도달하지 않기 때문에 모듈을 시작할 때 발생하지 않습니다. 스크립트 컴파일되지 않을 것이다.

저는 약간의 연구를했는데,이 문제는 다른 사람들 (솔루션을 게시하지 않고 문제를 해결 한 제 3 자 라이브러리를 사용하는 경우가 많음)을 때렸다는 것을 알고 있습니다. Windows에서 fork()가없고 Windows에서 파이썬이 멀티 프로세싱을 처리하는 것을 추적하는 것 같습니다. http://docs.python.org/library/multiprocessing.html#windows도 참조하십시오. 하지만이 문제를 해결하는 방법은별로 없습니다.

이것은 Windows 7 x64에서 실행되는 최신 Python 2.7 브랜치 (2.7.8)입니다.

+0

이 있습니까 당신이 당신의 코드에서 들여 쓰기 실수가 파이썬 3.4상의 명시 적으로 상대 가져 오기 작업을 수행하는 것이 또한 노트의

, 견본? 'main'은'BaseModule'의 인스턴스 메서드로 사용하는 방식으로 전혀 작동하지 않습니다. –

+0

아, 네. 여기에 관련성이있는 부분을 캡처하기 위해 많은 코드를 다듬 었습니다. 즉, 감독이었습니다 – user2093082

+0

@ user2093082 최소한의 예를 들어이 코드가 재현 되나요? virtualenv 외부에서 실행하면 재현됩니까? – dano

답변

2

당신은 OtherCustomClass의 절대 가져 오기를 사용하여이 문제를 해결할 수 있습니다

from base_module import OtherCustomClass 

나는 이유는 정확히 모르겠지만,이 multiprocessing 새로운 프로세스를 생성하고 __main__을 가져올 때 것 같다, 그것은 수 없습니다입니다 OtherCustomClass과 함께 사용하는 암시 적 상대 가져 오기를 처리 할 수 ​​있습니다. 명시 적으로 base_module에서 가져 오는 경우 제대로 작동합니다. 내 생각에 생성 된 자식 프로세스는 base_module 패키지의 일부로 인식되지 않으므로 암시 적 가져 오기는 실패하지만 이는 단지 추측에 불과합니다.

you shouldn't be using implicit relative imports anyway (모두 파이썬 3에서 삭제되었습니다), 절대 가져 오기로 전환하는 것은 나쁜 일이 아닙니다.

from . import OtherCustomClass 

그러나 파이썬 2.7 실패 :

Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
    File "C:\python27\lib\multiprocessing\forking.py", line 380, in main 
    prepare(preparation_data) 
    File "C:\python27\lib\multiprocessing\forking.py", line 495, in prepare 
    '__parents_main__', file, path_name, etc 
    File "C:\Users\oreild1\Desktop\base_module\Launcher.py", line 5, in <module> 
    from . import OtherCustomClass 
ValueError: Attempted relative import in non-package 
error: 
Traceback (most recent call last): 
    File "C:\Users\oreild1\Desktop\base_module\Launcher.py", line 18, in main 
    basmod = BaseModule(argv[0], argv[1]) 
    File "C:\Users\oreild1\Desktop\base_module\Launcher.py", line 10, in __init__ 
    self.manager.start() 
    File "C:\python27\lib\multiprocessing\managers.py", line 528, in start 
    self._address = reader.recv() 
EOFError 
+0

이것은 완벽합니다. 원래 파일 이름 (Linux에서 작동)에 의해 가져 왔지만 Windows에서 작동하지 않는 것을 발견 했으므로 아마도 포크로 인해 발생했을 것입니다. 모듈 가져 오기 및 클래스 선택은 작동합니다. – user2093082