Python 如何将模块导入为_umain _;?
我有一个模块,具有通常的Python 如何将模块导入为_umain _;?,python,Python,我有一个模块,具有通常的 if __name__ == '__main__': do stuff... 成语 我想从另一个模块导入该代码,并愚弄它运行该代码。有没有办法做到这一点 我应该提到的是,出于我不在这里讨论的原因,我无法更改导入模块中的代码。我需要以某种方式修改导入过程,以便在导入时它的名称是main,可以使用ihooks或类似工具。将该代码放入函数中,并从要导入的模块中调用它 def stuff(): ... if __name__ == '__main__':
if __name__ == '__main__':
do stuff...
成语
我想从另一个模块导入该代码,并愚弄它运行该代码。有没有办法做到这一点
我应该提到的是,出于我不在这里讨论的原因,我无法更改导入模块中的代码。我需要以某种方式修改导入过程,以便在导入时它的名称是main,可以使用ihooks或类似工具。将该代码放入函数中,并从要导入的模块中调用它
def stuff():
...
if __name__ == '__main__':
stuff()
然后在要将其导入的模块中:
import module
module.stuff()
把它放在一个函数中:
def _main():
do stuff
if __name__ == '__main__':
main()
还有,执行脚本而不是导入它。但我认为这是一个极其苛刻的解决方案。 然而,理想的模式是:
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()
主节中的代码通常没有意义直接运行。如果要运行它,请使用
子流程
在另一个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)
在任何您想作为主模块运行的模块中
例如,如果您有一个库模块,您可以始终使用此结构来执行特定的测试。正如其他答案中所指出的,这是一个坏主意,您应该以其他方式解决此问题 无论如何,Python的工作方式如下:
import runpy
result = runpy._run_module_as_main("your.module.name"))
正确答案已经给出,但仅限于评论(见 及) 格式正确的情况下也一样:
import runpy
runpy.run_module("your.module.name", {}, "__main__")
或
谢谢,但我已经澄清了这个问题-我不能修改导入的模块,使所有代码都包含在这样的主函数中。谢谢。在这种情况下是这样的,用子进程运行它并不能解决我的问题。谢谢,但我已经澄清了问题-我不能修改导入的模块,使所有代码都包含在这样的do_stuff函数中。谢谢,但我已经澄清了问题-我不能修改导入的模块,使所有代码都包含在这样的主函数中。谢谢,但我已经澄清了这个问题-我不能修改导入的模块,使所有代码都包含在这样的stuff函数中。这是可行的,但由于正在运行的模块将与当前代码共享相同的全局命名空间,它可能会读取和/或覆盖您希望它不读取/覆盖的值。您可以调用
runpy.run\u模块(“your.module.name”,{},“\uuu main\uuuu”)
,这将为它提供一个独立的全局名称空间。对于文件名而不是虚线导入名,请使用runpy.run\u路径(“path/to/my/file.py”,{},\uu main\uuu”)
。
import runpy
runpy.run_path("path/to/my/file.py", {}, "__main__")