繁体   English   中英

如何将模块导入为 __main__?

[英]How to import a module as __main__?

我有一个具有通常的模块

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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM