2013-03-26 14 views
7

Używam Python 3.1.4, który jest osadzony jako środowisko skryptowe w aplikacji (x64). Do tej pory napotkałem wiele ograniczeń z wbudowanym python. Nie wiem, czy to normalne, czy też programiści aplikacji zablokowali niektóre funkcje.Wbudowany python: wieloprocesor nie działa

Na przykład poniższy kod nie działa:

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 powrotna droga do aplikacji.

Próbowałem to jako WEL:

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

bez powodzenia.

Czy jest możliwe obejście tego problemu? Jest bardzo mało prawdopodobne, że będę miał wpływ, aby twórcy aplikacji zmieniali coś w swoim kodzie.

Dzięki

EDIT

mam go do pracy przez dodanie poniższych informacji:

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

Potrzebowałem tej linii, a także:

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

W przeciwnym razie otwiera się inne wystąpienie aplikacji zamiast uruchamiać kod.

Jedyny problem, jaki mi pozostał, to to, że nie mogę używać metod kontrolujących samą aplikację (takich jak: create_project(), add_report(), ..). Moim głównym celem było umożliwienie wywoływania wielu metod bez konieczności oczekiwania na zakończenie pierwszej. Ale myślę, że to po prostu niemożliwe.

+0

czy jesteś pewien, że nie chcesz używać wątków zamiast wieloprocesorowych? –

+0

Który OS? ...... – NPE

+0

@ Ionut Hulub: Mam również problemy z wątkami, coś z GILem, jak sądzę. Dlatego próbowałem przy wieloprocesowym przetwarzaniu @ NPE: Windows 7, 64-bitowy –

Odpowiedz

7

Domyślnie sys.argv nie jest dostępny w postaci kodu osadzonego:

Embedding Python

Podstawową funkcją inicjalizacji Py_Initialize(). Inicjalizuje to tabelę załadowanych modułów i tworzy podstawowe moduły: __main__ i sys. Inicjuje również ścieżkę wyszukiwania modułu (sys.path).

Py_Initialize() nie ustawia "listy argumentów skryptu" (sys.argv). Jeśli zmienna ta jest potrzebna kodu Pythona, który zostanie wykonany później, musi być ustawione wprost z wezwaniem do PySys_SetArgvEx (argc, argv, updatepath) po wywołaniu Py_Initialize()

na Windows, multiprocessing musi odradzać nowe procesy od początku. Używa przełącznika linii poleceń --multiprocessing-fork do rozróżniania procesów potomnych, a także przesyła oryginalny plik argv z nadrzędnego na podrzędny.

Przypisanie przed utworzeniem podprocesów, tak jak odkryto, może wydawać się dobrym rozwiązaniem.

Drugi istotny element dokumentacji jest to, że multiprocessing.set_executable():

Ustawia ścieżkę do interpretera Pythona używać podczas uruchamiania procesu potomnego. (Domyślnie używany jest sys.executable). Embedders prawdopodobnie będzie trzeba zrobić kilka rzeczy jak

set_executable(os.path.join(sys.exec_prefix, 'pythonw.exe'))
przed mogą tworzyć procesy potomne. (Tylko Windows)