我有一个通常的
模块if __name__ == '__main__':
do stuff...
成语。
我想从另一个模块导入它,并欺骗它运行该代码。有没有办法做到这一点?
我应该提一下,由于我不会进入这里的原因,我无法更改导入模块中的代码。我需要以某种方式修改导入过程,以便在导入时它的名称是主要的,可能使用ihooks或类似的。
答案 0 :(得分:11)
正如其他答案中所指出的,这是一个坏主意,你应该以其他方式解决问题。
无论如何,Python的方式是这样的:
import runpy
result = runpy._run_module_as_main("your.module.name"))
答案 1 :(得分:8)
有,执行脚本而不是导入它。但我认为这是一个非常强硬的解决方案。
然而理想的模式是:
def do_stuff():
... stuff happens ...
if __name__ == '__main__':
do_stuff()
你可以这样做:
from mymodule import do_stuff
do_stuff()
编辑:在澄清无法编辑模块代码后回答。
我绝不会在任何生产代码中推荐这个,这是“自担风险”解决方案。
import mymodule
with open(os.path.splitext(mymodule.__file__)[0] + ".py") as fh:
exec fh.read()
答案 2 :(得分:4)
将该代码放入一个函数中,并从您导入它的模块中调用它。
def stuff():
...
if __name__ == '__main__':
stuff()
然后在模块中将其导入:
import module
module.stuff()
答案 3 :(得分:1)
已经给出了正确的答案,但是答案仅限于注释中(请参见How to import a module as __main__? 和How to import a module as __main__?)。
使用正确的格式相同:
import runpy
runpy.run_module("your.module.name", {}, "__main__")
或
import runpy
runpy.run_path("path/to/my/file.py", {}, "__main__")
答案 4 :(得分:0)
把它放在一个函数中:
def _main():
do stuff
if __name__ == '__main__':
main()
答案 5 :(得分:0)
主节中的代码通常 never 直接运行是有意义的。如果要运行它,请使用subprocess
在另一个Python解释器中运行它。
答案 6 :(得分:0)
以下是Python中主要模块的示例:
#! /usr/bin/env python
import sys
import os
def main(arg1, arg2, arg3):
print(arg1, arg2, arg3)
if __name__ == "__main__":
main(*sys.argv)
但你也可以包括
def main():
#The module contains Python code specific to the library module,
#like tests, and follow the module with this:
if __name__ == "__main__":
main(*sys.argv)
在您想要作为主要运行的任何模块中。
例如,如果你有一个库模块,你总是可以使用这个结构来执行特定的测试。