【问题标题】:How to import the main function from a Python file not defining "def main" in it?如何从未定义“def main”的 Python 文件中导入主函数?
【发布时间】:2018-05-11 20:17:24
【问题描述】:

我正在编写一个 Python (3.5) 模块,我想在其中使用来自开源项目的现有 Python 模块。我要导入的模块包含:

  • 几个功能
  • if __name__ == '__main__': 指令

但不包含def main(args) 函数。

由于没有实际的main 函数,我无法通过import module 将其导入并用作module.main()。虽然我确实找到了通过命令os.system()subprocess.Popen() 将其作为脚本单独执行的选项,但我实际上正在寻找一种方法来使这个调用成为我代码中不可或缺的一部分。

我知道我可以在原始代码中自己添加def main() 部分,但由于它来自一个开源项目,我正在寻找保持不变的方法,这样我就不需要自己维护它如果它得到更新。

我遇到了其他非常相似的问题,例如 thisthis 无法解决我的问题。 This answer 让我觉得我正在努力做的事情并非微不足道。

有什么办法吗?

【问题讨论】:

  • 理论上,您可以编写某种讨厌的导入钩子来重写 ast 以将 if __name__ == '__main__' 转换为函数。在实践中,这可能是真正奇怪的错误和维护噩梦的秘诀。您是否考虑过仅提交拉取请求以添加 main 函数?
  • 如果模块是这样写的,那么作者完全有可能认为if __name__ == '__main__':块内的代码是模块初始化代码,不能多次运行。
  • @LarryLustig,这可能是真的。我希望找到一个大的快捷方式并尽可能多地提取现有代码,但如果我这样想,如果我调用 that 脚本/函数 all,我可能不会做正确的事情时间。

标签: python python-import main


【解决方案1】:

当您第一次import 一个模块时(与导入函数不同),该模块中的所有代码都会执行。这意味着定义了函数,定义了全局变量等。我们编写if __name__ == "__main__": 块的原因是在导入模块时,该代码不会执行(它只会执行if name == "main")。如果您只是删除if __name__ == "__main__": 行并修复缩进,则该代码将在您导入模块时执行。以这个模块hello.py 为例:

def hello_world():
    print("Hello world")
if __name__ == "__main__":
    hello_world()

如果我们导入:

import hello
hello_world()

下面的代码将与第一个模块再次为 hello.py 的情况相同:

def hello_world():
    print("hello world")
hello_world()

要执行的模块:

import hello

我建议你不要这样做,你真的应该只编辑以包含一个主要功能。

【讨论】:

  • 首先,每次导入模块时不会执行;它只会第一次执行(每个 Python 进程)。其次,提问者不想编辑文件。第三,即使对于涉及编辑文件的解决方案,添加main 函数也是更好的方法。
  • 我已经更正了关于你的第一点的回答,我没有注意到你的第二点,我一直同意,但已经编辑以解释你的第三点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多