2013-03-26 2 views
7

저는 응용 프로그램 (x64)에서 스크립팅 환경으로 임베드 된 Python 3.1.4를 사용하고 있습니다. 지금까지 나는 임베디드 파이썬에 많은 한계가있었습니다. 나는 그것이 정상적인 것인지 또는 애플리케이션의 프로그래머가 일부 기능을 차단했는지 알 수 없다.임베디드 Python : 멀티 프로세싱이 작동하지 않습니다.

예를 들어 다음과 같은 코드가 작동하지 않습니다 :

from multiprocessing import Process 
def f(name): 
    print('hello', name) 

if __name__ == '__main__': 
    p = Process(target=f, args=('bob',)) 
    p.start() 
    p.join() 

# --> error in forking.py: 'module' object has no attribute 'argv' 
# print(sys.argv) gives the same error 

sys.executable 반환 응용 프로그램의 경로입니다.

나는 아으로 이것을 시도했다 : 성공없이

multiprocessing.forking.set_executable('C:\Python31\python.exe') 
multiprocessing.set_executable('C:\Python31\python.exe') 

.

가능한 해결 방법이 있습니까? 응용 프로그램 개발자가 코드에서 무언가를 바꿀 수있는 영향력을 가지지는 않을 것입니다.

감사

편집

나는 다음과 같은 추가 작업을 얻었다 :

sys.argv = ['c:/pathToScript/scipt.py']

은 나뿐만 아니라이 줄을 필요 :

multiprocessing.set_executable('C:/Python31/python.exe')

그렇지 않으면 코드를 실행하는 대신 응용 프로그램의 다른 인스턴스가 열립니다.

유일한 문제는 응용 프로그램 자체를 제어하는 ​​메서드 (예 : create_project(), add_report())를 사용할 수 없다는 것입니다. 나의 주요 목표는 첫 번째 목표가 완료 될 때까지 기다릴 필요없이 여러 메소드를 호출하는 것이 었습니다. 그러나 나는 이것이 불가능하다고 생각합니다. 기본적으로

+0

멀티 프로세싱 대신 스레딩을 사용 하시겠습니까? –

+0

어느 OS입니까? ...... – NPE

+0

@ Ionut Hulub : 나는 실을 꿰기에 문제가 있습니다. 나는 GIL으로 무언가를 추정합니다. 이것이 멀티 프로세싱을 시도한 이유입니다. @ NPE : Windows 7, 64bit –

답변

7

sys.argv는 임베디드 코드에서 사용할 수 없습니다 :

Embedding Python

기본 초기화 함수는() Py_Initialize이다. 이것은 로드 된 모듈의 테이블을 초기화하고 기본 모듈 builtins, __main__ 및 sys를 생성합니다. 또한 모듈 검색 경로 (sys.path)를 초기화합니다.

Py_Initialize()가 "스크립트 인수 목록"(sys.argv)을 설정하지 않습니다. 경우이 변수가 나중에, 그것은 이 Py_Initialize 호출 후 PySys_SetArgvEx를 호출 (는 argc, argv를, updatepath)() Windows에서

명시 적으로 설정해야 실행됩니다 파이썬 코드가 필요하다, multiprocessing은 처음부터 새 프로세스를 생성해야합니다. 자식 프로세스를 구분하기 위해 명령 줄 스위치 --multiprocessing-fork을 사용하고 원래 부모로부터 자식으로 argv 원본을 전송합니다.

발견 한 것처럼 서브 프로세스를 만들기 전에 sys.argv = ['c:/pathToScript/scipt.py']을 지정하면 이 좋은 대안으로 보입니다.

이 설정 자식 프로세스를 시작할 때 파이썬 인터프리터의 경로를 사용 :

문서의 두 번째 관련 부분

multiprocessing.set_executable()의 것입니다. 기본적으로 sys.executable이 사용됩니다. 임베딩 아마 그들이 자식 프로세스를 생성 할 수 있습니다 전에

set_executable(os.path.join(sys.exec_prefix, 'pythonw.exe'))
같은 어떤 것을 을 수행해야합니다. (Windows에만 해당)

관련 문제