在Python中,我可以调用导入模块的main()吗?

2024-04-26 07:22:16 发布

您现在位置:Python中文网/ 问答频道 /正文


Tags: python
3条回答

这要看情况。如果主代码受if保护,如下所示:

if __name__ == '__main__':
    ...main code...

然后不,您不能让Python执行它,因为您不能影响自动变量__name__

但是当所有的代码都在一个函数中时,就可以了。试试看

import myModule

myModule.main()

即使当模块使用__all__保护自己时,这也可以工作。

from myModule import *可能无法使main对您可见,因此您确实需要导入模块本身。

马蒂金的回答是有道理的,但它遗漏了一些重要的东西,其他人可能会觉得很明显,但我很难搞清楚。

在使用argparse的版本中,需要在主体中包含这一行。

args = parser.parse_args(args)

通常,当您在脚本中使用argparse时,您只需编写

args = parser.parse_args()

parse_args从命令行查找参数。但在这种情况下,main函数不能访问命令行参数,因此必须告诉argparse参数是什么。

下面是一个例子

import argparse
import sys

def x(x_center, y_center):
    print "X center:", x_center
    print "Y center:", y_center

def main(args):
    parser = argparse.ArgumentParser(description="Do something.")
    parser.add_argument("-x", "--xcenter", type=float, default= 2, required=False)
    parser.add_argument("-y", "--ycenter", type=float, default= 4, required=False)
    args = parser.parse_args(args)
    x(args.xcenter, args.ycenter)

if __name__ == '__main__':
    main(sys.argv[1:])

假设您将此命名为mytest.py 要运行它,您可以从命令行执行这些操作

python ./mytest.py -x 8
python ./mytest.py -x 8 -y 2
python ./mytest.py 

分别返回

X center: 8.0
Y center: 4

或者

X center: 8.0
Y center: 2.0

或者

X center: 2
Y center: 4

或者如果你想从另一个python脚本运行,你可以

import mytest
mytest.main(["-x","7","-y","6"]) 

又回来了

X center: 7.0
Y center: 6.0

只是一个功能。导入并调用它:

import myModule

myModule.main()

如果需要分析参数,有两个选项:

  • main()中解析它们,但作为参数传入sys.argv(下面的所有代码都在同一个模块中myModule):

    def main(args):
        # parse arguments using optparse or argparse or what have you
    
    if __name__ == '__main__':
        import sys
        main(sys.argv[1:])
    

    现在您可以从其他模块导入并调用myModule.main(['arg1', 'arg2', 'arg3'])

  • main()接受已分析的参数(同样是myModule模块中的所有代码):

    def main(foo, bar, baz='spam'):
        # run with already parsed arguments
    
    if __name__ == '__main__':
        import sys
        # parse sys.argv[1:] using optparse or argparse or what have you
        main(foovalue, barvalue, **dictofoptions)
    

    导入并调用myModule.main(foovalue, barvalue, baz='ham')其他地方,并根据需要传入python参数。

这里的技巧是检测何时将模块用作脚本;何时将python文件作为主脚本运行(python filename.py)时不使用import语句,因此python调用该模块"__main__"。但是,如果相同的filename.py代码被视为一个模块(import filename),那么python将其用作模块名。在这两种情况下,变量__name__都是设置的,并且对其进行测试可以告诉您代码是如何运行的。

相关问题 更多 >