我正在創建一個類,並且在初始化它時,我正在調用(多進程)它的函數。當我從相同的.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其他職位)如何解決它。
非常感謝您的幫助!
非常感謝@乙醚(+1)!它確實有效。也就是說,我的真實程序要複雜得多(我已經在這裏放了一個簡單的例子)。也就是說,如果我在main(或「example.py」,如這裏)中添加[if __name__ ==「__main__」],會發生什麼?程序是否等待一切都被初始化,然後才調用其他類的初始化?它是否等待?或會發生什麼?非常感謝你! – Yura
所以這裏有一個實驗:嘗試在你的MyDummyClass聲明文件中添加相同的'if name = main'塊並運行'example.py'。你會看到那個代碼沒有運行,因爲你沒有將該腳本作爲主腳本運行!當python導入腳本時,它會在導入時執行腳本全局範圍內的所有代碼。將'name main'塊放在一個腳本中告訴python如果它正在導入它,就不要執行它,並且只在它是主要的時候(以及初始化之後)執行。此外,如果我的答案奏效,你介意將它標記爲接受的答案:) – AetherUnbound
謝謝@AetherUnboud。當然(標記爲答案)。是的,我試了一下,並沒有奏效(如預期)。我所問的是關於**初始化會發生什麼**?主進程是否會「等待」,直到所有內容都被安全地初始化,然後運行其他類和它們的多進程? – Yura