如何将模块导入为__main__?

时间:2012-06-22 16:47:58

标签: python

我有一个通常的

模块
if __name__ == '__main__':
    do stuff...

成语。

我想从另一个模块导入它,并欺骗它运行该代码。有没有办法做到这一点?

我应该提一下,由于我不会进入这里的原因,我无法更改导入模块中的代码。我需要以某种方式修改导入过程,以便在导入时它的名称是主要的,可能使用ihooks或类似的。

7 个答案:

答案 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)

在您想要作为主要运行的任何模块中。

例如,如果你有一个库模块,你总是可以使用这个结构来执行特定的测试。