微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

谢谢!

解决方法

您可能对这个概念感到困惑。 Python 中的 if __name__ == "__main__" 守卫完全存在,以便所有 Python 文件都可以导入。

如果没有保护,文件一旦导入,就会有相同的行为,就好像它是“根”程序一样——而且它需要大量的波勒板和进程间通信(像在固定的文件系统位置编写一个“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()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。