繁体   English   中英

如何导入需要 __name__ == "__main__" 的脚本

[英]How to import script that requires __name__ == "__main__"

我对 Python 很陌生,这个问题可能表明了这一点。 我正在处理我的脚本的多处理部分,找不到我的问题的明确答案。

我正在为一件事而苦苦挣扎。 使用多处理时,必须使用 if __name__ == "__main__"保护部分代码。 我明白了,我的游泳池工作得很好。 但我很想导入整个脚本(让它成为一个返回参数的大 function 是最好的)。 这就是问题所在。 首先,如果由于那个守卫,它的一部分只能在从主/源文件启动时运行,我该如何导入? 其次,如果我设法解决它并且整个脚本将在一个大 function 中,pickle 无法处理,将使用“多处理莳萝”或“pathos”修复它吗?

谢谢!

您可能对这个概念感到困惑。 Python 中的if __name__ == "__main__"保护正是为了让所有 Python 文件都可以导入而存在。

如果没有警卫,文件一旦导入,将具有与“根”程序相同的行为- 并且需要大量的 boiler 板和进程间通信(例如在固定位置写入“PID”文件)文件系统位置)来协调相同代码的导入,包括多处理。

只需将需要为根进程运行的任何代码置于保护之下。 您移动到可以从导入代码调用的函数中的所有其他内容。

如果您运行“所有”脚本,即使设置多处理工作人员的部分也会运行,并且任何简单的工作都会以指数方式创建更多工作人员,直到所有机器资源都被占用(即:它会快速崩溃,可能会占用机进入无响应状态)。

所以,这是一个很好的模式 - “dothejob” function 可以调用您需要的所有其他功能,因此您只需从主进程或任何其他项目导入并调用它,将您的文件作为 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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM