我有一个具有通常的模块
if __name__ == '__main__':
do stuff...
成语。
我想从另一个模块导入它,并欺骗它运行该代码。有没有办法做到这一点?
我应该提一下,由于我不会在这里讨论的原因,我无法更改导入模块中的代码。我需要以某种方式修改导入过程,以便在导入时它的名称是主要的,可能使用 ihooks 或类似的。
我有一个具有通常的模块
if __name__ == '__main__':
do stuff...
成语。
我想从另一个模块导入它,并欺骗它运行该代码。有没有办法做到这一点?
我应该提一下,由于我不会在这里讨论的原因,我无法更改导入模块中的代码。我需要以某种方式修改导入过程,以便在导入时它的名称是主要的,可能使用 ihooks 或类似的。
正如其他答案中指出的那样,这是一个坏主意,您应该以其他方式解决问题。
无论如何,Python 的做法是这样的:
import runpy
result = runpy._run_module_as_main("your.module.name"))
有,执行脚本而不是导入它。但我认为这是一个非常骇人听闻的解决方案。
然而,理想的模式是:
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()
将该代码放入一个函数中,并从您将其导入的模块中调用它。
def stuff():
...
if __name__ == '__main__':
stuff()
然后在模块中将其导入:
import module
module.stuff()
正确答案已经给出,但它仅限于评论中(请参阅如何将模块导入为 __main__? 和如何将模块导入为 __main__?)。
与正确的格式相同:
import runpy
runpy.run_module("your.module.name", {}, "__main__")
或者
import runpy
runpy.run_path("path/to/my/file.py", {}, "__main__")
主节中的代码直接运行通常毫无意义。如果要运行它,请使用subprocess
在另一个 Python 解释器中运行它。
以下是 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)
在您想作为主要运行的任何模块中。
例如,如果你有一个库模块,你总是可以使用这个结构来执行特定的东西,比如测试。
把它放在一个函数中:
def _main():
do stuff
if __name__ == '__main__':
main()