У меня сложилось впечатление, что, поскольку многопроцессорный модуль Python не может работать при порождении новых процессов в Windows, при запуске нового процесса будет импортирован исходный модуль (с которого запускается родительский процесс) с нуля. Это означает, например, что любой код, не защищенный предложением if __name__=='__main__'
, будет выполняться в дочернем процессе. При выполнении простого теста это не всегда так.
Учитывая следующий простой пакет и скрипт со следующей структурой файла:
test.py
test_package
│-- __init__.py
\-- __main__.py
и следующее содержимое:
# ------------------------------
# __init__.py
# ------------------------------
print("__init__.py", flush=True)
import multiprocessing
def main():
print("Hi from the main function!", flush=True)
p = multiprocessing.Process(
target=print,
args=("Hi from the process!",),
kwargs={'flush': True}
)
p.start()
p.join()
# ------------------------------
# __main__.py
# ------------------------------
print("__main__.py", flush=True)
from . import main
if __name__ == __name__ == "__main__":
print("Hi from the main file!", flush=True)
main()
# ------------------------------
# test.py
# ------------------------------
print("test.py", flush=True)
import test_package
if __name__ == "__main__":
print("Hi from the test script!", flush=True)
test_package.main()
Запуск test.py, как и ожидалось, выдает следующее:
IN > python test.py
OUT> test.py
__init__.py
Hi from the test script!
Hi from the main function!
test.py
__init__.py
Hi from the process!
Однако, когда я запускаю модуль как скрипт, используя python -m
, Я получаю это:
IN > python -m test_package
OUT> __init__.py
__main__.py
Hi from the main file!
Hi from the main function!
Hi from the process!
Я ожидаю, что __init__.py
будет напечатан до вывода дочернего процесса. Чем отличаются эти два варианта использования;что мне не хватает?