如何导入需要 __name__ == "__main__" 的脚本
How to import script that requires __name__ == "__main__"
我是 Python 的新手,这个问题可能表明了这一点。我正在处理我的脚本的多处理部分,找不到我的问题的明确答案。
我正在为一件事苦苦挣扎。使用多处理时,部分代码必须用 if __name__ == "__main__"
进行保护。我明白了,我的游泳池工作得很好。但我很想导入整个脚本(使它成为一个大函数,returns 一个参数是最好的)。这就是问题所在。首先,如果由于那个守卫而从 main/source 文件启动时部分内容只会 运行,我该如何导入?其次,如果我设法解决它并且整个脚本将在一个大函数中,pickle 无法处理它,是否会使用“multiprocessing on dill”或“pathos”修复它?
谢谢!
您可能对这个概念感到困惑。 Python 中的 if __name__ == "__main__"
守卫 恰好 存在,以便所有 Python 文件都可以导入。
如果没有防护,文件一旦被导入,就会具有与“根”程序相同的行为——并且需要大量的 boyler 板和进程间通信(如在固定文件系统位置写入“PID”文件)以协调相同代码的导入,包括多处理。
只需将根进程 运行 需要的任何代码都置于保护之下。您移入可从导入代码中调用的函数的所有其他内容。
如果您运行“所有”脚本,即使是设置多处理工作人员的部分也会运行,并且任何简单的工作都会以指数方式创建更多工作人员,直到所有机器资源都被占用(即:它会很快崩溃,可能会使机器进入无响应状态)。
所以,这是一个很好的模式 - “dothejob”函数可以调用所有
你需要的其他功能,所以你只需要导入并调用它,
来自主流程,或来自任何其他导入项目
您的文件作为 Python 模块。
import multiprocessing
...
def dothejob():
...
def start():
# code to setup and start multiprocessing workers:
# like:
worker1 = multiprocessing.Process(target=dothejob)
...
worker1.start()
...
worker1.join()
if __name__ == "__main__":
start()
我是 Python 的新手,这个问题可能表明了这一点。我正在处理我的脚本的多处理部分,找不到我的问题的明确答案。
我正在为一件事苦苦挣扎。使用多处理时,部分代码必须用 if __name__ == "__main__"
进行保护。我明白了,我的游泳池工作得很好。但我很想导入整个脚本(使它成为一个大函数,returns 一个参数是最好的)。这就是问题所在。首先,如果由于那个守卫而从 main/source 文件启动时部分内容只会 运行,我该如何导入?其次,如果我设法解决它并且整个脚本将在一个大函数中,pickle 无法处理它,是否会使用“multiprocessing on dill”或“pathos”修复它?
谢谢!
您可能对这个概念感到困惑。 Python 中的 if __name__ == "__main__"
守卫 恰好 存在,以便所有 Python 文件都可以导入。
如果没有防护,文件一旦被导入,就会具有与“根”程序相同的行为——并且需要大量的 boyler 板和进程间通信(如在固定文件系统位置写入“PID”文件)以协调相同代码的导入,包括多处理。
只需将根进程 运行 需要的任何代码都置于保护之下。您移入可从导入代码中调用的函数的所有其他内容。
如果您运行“所有”脚本,即使是设置多处理工作人员的部分也会运行,并且任何简单的工作都会以指数方式创建更多工作人员,直到所有机器资源都被占用(即:它会很快崩溃,可能会使机器进入无响应状态)。
所以,这是一个很好的模式 - “dothejob”函数可以调用所有 你需要的其他功能,所以你只需要导入并调用它, 来自主流程,或来自任何其他导入项目 您的文件作为 Python 模块。
import multiprocessing
...
def dothejob():
...
def start():
# code to setup and start multiprocessing workers:
# like:
worker1 = multiprocessing.Process(target=dothejob)
...
worker1.start()
...
worker1.join()
if __name__ == "__main__":
start()