0

我正在創建一個類,並且在初始化它時,我正在調用(多進程)它的函數。當我從相同的.py文件創建此類時,一切正常。但是,當我從另一個.py文件初始化此類時 - 它會失敗並引發錯誤...爲什麼?無法從另一個python .py文件運行進程

MyDummyClass.py:

import multiprocessing 
class MyDummyClass:    
    def __init__(self):   

     print("I am in '__init__()'") 

     if __name__ == 'MyDummyClass': 

      p = multiprocessing.Process(target=self.foo()) 
      p.start() 


    def foo(self): 
     print("Hello from foo()") 

example.py:

from MyDummyClass import MyDummyClass 
dummy = MyDummyClass() 

當我運行example.py,我收到此錯誤:

I am in '__init__()' 
Hello from foo() 
I am in '__init__()' 
Hello from foo() 

Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
    File "C:\Python\lib\multiprocessing\spawn.py", line 105, in spawn_main 
    exitcode = _main(fd) 
    File "C:\Python\lib\multiprocessing\spawn.py", line 114, in _main 
    prepare(preparation_data) 
    File "C:\Python\lib\multiprocessing\spawn.py", line 225, in prepare 
    _fixup_main_from_path(data['init_main_from_path']) 
    File "C:\Python\lib\multiprocessing\spawn.py", line 277, in _fixup_main_from_path 
    run_name="__mp_main__") 
    File "C:\Python\lib\runpy.py", line 263, in run_path 
    pkg_name=pkg_name, script_name=fname) 
    File "C:\Python\lib\runpy.py", line 96, in _run_module_code 
    mod_name, mod_spec, pkg_name, script_name) 
    File "C:\Python\lib\runpy.py", line 85, in _run_code 
    exec(code, run_globals) 
    File "E:\Dropbox\Docs\Business\_NZTrackAlerts\Website\Current dev\NZtracker\cgi-bin\example1.py", line 2, in <module> 
    dummy = MyDummyClass() 
    File "...path to my file...\MyDummyClass.py", line 13, in __init__ 
    p.start() 
    File "C:\Python\lib\multiprocessing\process.py", line 105, in start 
    self._popen = self._Popen(self) 
    File "C:\Python\lib\multiprocessing\context.py", line 223, in _Popen 
    return _default_context.get_context().Process._Popen(process_obj) 
    File "C:\Python\lib\multiprocessing\context.py", line 322, in _Popen 
    return Popen(process_obj) 
    File "C:\Python\lib\multiprocessing\popen_spawn_win32.py", line 33, in __init__ 
    prep_data = spawn.get_preparation_data(process_obj._name) 
    File "C:\Python\lib\multiprocessing\spawn.py", line 143, in get_preparation_data 
    _check_not_importing_main() 
    File "C:\Python\lib\multiprocessing\spawn.py", line 136, in _check_not_importing_main 
    is not going to be frozen to produce an executable.''') 
RuntimeError: 
     An attempt has been made to start a new process before the 
     current process has finished its bootstrapping phase. 

     This probably means that you are not using fork to start your 
     child processes and you have forgotten to use the proper idiom 
     in the main module: 

      if __name__ == '__main__': 
       freeze_support() 
       ... 

     The "freeze_support()" line can be omitted if the program 
     is not going to be frozen to produce an executable. 

我不明白(而不是來回m其他職位)如何解決它。

非常感謝您的幫助!

回答

2

這與python實際執行腳本的方式有關。拋出的錯誤基本上說,當python還沒有準備好時,你正試圖開始一個新的進程。這是因爲你在主腳本中調用了dummy = MyDummyClass()而沒有給python一個完全初始化的機會。如果你不是有example.py這樣的:

from MyDummyClass import MyDummyClass 
if __name__ == "__main__": 
    dummy = MyDummyClass() 

這將產生所需輸出:

C:\Python Scripts>python example.py 
I am in '__init__()' 
Hello from foo() 

if __name__ == "__main__"塊告訴蟒蛇「只有當腳本正在運行爲主腳本執行這個(即python example.py),這將強制python在運行該塊之前正確初始化所有內容。

道歉,如果此答案沒有足夠的描述python後端發生了什麼,因爲它正在做初始化,我自己也不知道一噸:)

+0

非常感謝@乙醚(+1)!它確實有效。也就是說,我的真實程序要複雜得多(我已經在這裏放了一個簡單的例子)。也就是說,如果我在main(或「example.py」,如這裏)中添加[if __name__ ==「__main__」],會發生什麼?程序是否等待一切都被初始化,然後才調用其他類的初始化?它是否等待?或會發生什麼?非常感謝你! – Yura

+0

所以這裏有一個實驗:嘗試在你的MyDummyClass聲明文件中添加相同的'if name = main'塊並運行'example.py'。你會看到那個代碼沒有運行,因爲你沒有將該腳本作爲主腳本運行!當python導入腳本時,它會在導入時執行腳本全局範圍內的所有代碼。將'name main'塊放在一個腳本中告訴python如果它正在導入它,就不要執行它,並且只在它是主要的時候(以及初始化之後)執行。此外,如果我的答案奏效,你介意將它標記爲接受的答案:) – AetherUnbound

+0

謝謝@AetherUnboud。當然(標記爲答案)。是的,我試了一下,並沒有奏效(如預期)。我所問的是關於**初始化會發生什麼**?主進程是否會「等待」,直到所有內容都被安全地初始化,然後運行其他類和它們的多進程? – Yura

相關問題