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

Posted

技术标签:

【中文标题】如何导入需要 __name__ == "__main__" 的脚本【英文标题】:How to import script that requires __name__ == "__main__" 【发布时间】:2021-08-25 22:09:47 【问题描述】:

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

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

谢谢!

【问题讨论】:

您应该将想要导入的代码放在一个函数中。然后使用该函数在您的其他模块的受保护的__name__ == '__main__' 块中。 " 其次,如果我设法解决它并且整个脚本将在一个大函数中,"整个脚本不必是一个巨大的函数。通常,您希望将代码分解为模块化、可重用且逻辑一致的部分。是的,可能有“一个功能来统治他们所有人”...... 【参考方案1】:

您可能对这个概念感到困惑。 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()

【讨论】:

再强调一点,您可以在另一个模块中调用module.start() 谢谢,这种方法效果很好。我还意识到我需要对课程进行教育,因为函数之间共享大量数据。谢谢!

以上是关于如何导入需要 __name__ == "__main__" 的脚本的主要内容,如果未能解决你的问题,请参考以下文章

python使用回文函数是不是需要导入

动态导入模块__import__("str")

如何在 Python3 中使用带有 if __name__='__main__' 块的相对导入?

unittest: if __name__ == "__main__" 理解

if __name__ =="__main__"

if __name__=="__main__"