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__")