12

我有一个具有通常的模块

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

成语。

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

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

4

7 回答 7

16

正如其他答案中指出的那样,这是一个坏主意,您应该以其他方式解决问题。

无论如何,Python 的做法是这样的:

import runpy
result = runpy._run_module_as_main("your.module.name"))
于 2015-07-14T00:55:08.450 回答
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()
于 2012-06-22T16:51:34.987 回答
3

将该代码放入一个函数中,并从您将其导入的模块中调用它。

def stuff():
    ...

if __name__ == '__main__':
    stuff()

然后在模块中将其导入:

import module
module.stuff()
于 2012-06-22T16:50:45.660 回答
1

正确答案已经给出,但它仅限于评论中(请参阅如何将模块导入为 __main__?如何将模块导入为 __main__?)。

与正确的格式相同:

import runpy
runpy.run_module("your.module.name", {}, "__main__")

或者

import runpy
runpy.run_path("path/to/my/file.py", {}, "__main__")
于 2020-09-27T09:08:36.733 回答
0

主节中的代码直接运行通常毫无意义。如果要运行它,请使用subprocess在另一个 Python 解释器中运行它。

于 2012-06-22T16:51:44.530 回答
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)

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

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

于 2012-06-22T23:28:29.670 回答
-1

把它放在一个函数中:

def _main():
   do stuff

if __name__ == '__main__':
    main()
于 2012-06-22T16:51:03.080 回答