在Python,我可以调用导入模块的主要()?(In Python, can I call the

2019-07-18 15:31发布

在Python我有一个模块 myModule.py其中I定义几个功能和主(),它需要几命令行参数。

我通常称之为主()从一个bash脚本。 现在,我想把一切都成小包装 ,所以我想,也许我可以把我的简单的bash脚本到一个Python脚本,并把它放在包中。

所以,实际上,我怎么 MyFormerBashScript.py 的main()函数 调用 myModule.py 的main()函数? 我甚至可以这样做吗? 我如何传递任何参数呢?

Answer 1:

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

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__设置,并针对测试告诉你,你的代码是如何运行的。



Answer 2:

Martijen的回答是有道理的,但它缺少一些至关重要的是,似乎是显而易见的给别人但我很难弄清楚。

在您使用argparse的版本,你需要有在主体这条线。

args = parser.parse_args(args)

通常,当您使用argparse只是你只写一个脚本

args = parser.parse_args()

和parse_args找到命令行参数。 但在这种情况下,主函数没有进入命令行参数,所以你必须要告诉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


Answer 3:

这取决于。 如果主代码是由一个受保护的if在:

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

再不行,你不能让Python的执行是因为你不能影响自动变量__name__

但是,当所有的代码是在一个函数,那么或许可以。 尝试

import myModule

myModule.main()

这样,即使在模块保护本身就带有__all__

from myModule import *可能没有main对你可见,让你真正需要导入模块本身。



Answer 4:

我一直在使用同样需要argparse了。 事情是parse_args的功能argparse.ArgumentParser对象实例由默认隐含接受它的参数sys.args 。 周围的工作,下面的Martijn线,包括使这明确,所以你可以改变你传递给参数的parse_args的愿望。

def main(args):
    # some stuff
    parser = argparse.ArgumentParser()
    # some other stuff
    parsed_args = parser.parse_args(args)
    # more stuff with the args

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

关键的一点是通过参数传递给parse_args功能。 后来,使用主,你只是做的马亭说。



Answer 5:

假设你正试图通过命令行参数也是如此。

import sys
import myModule


def main():
    # this will just pass all of the system arguments as is
    myModule.main(*sys.argv)

    # all the argv but the script name
    myModule.main(*sys.argv[1:])


Answer 6:

答案我正在寻找在这里回答: 如何使用Python argparse比其他参数是sys.argv ARGS?

如果main.pyparse_args()是这样写的,然后解析,可以很好地完成

# main.py
import argparse
def parse_args():
    parser = argparse.ArgumentParser(description="")
    parser.add_argument('--input', default='my_input.txt')
    return parser

def main(args):
    print(args.input)

if __name__ == "__main__":
    parser = parse_args()
    args = parser.parse_args()
    main(args)

然后,你可以调用main()和分析与论证parser.parse_args(['--input', 'foobar.txt'])到它在另一个python脚本:

# temp.py
from main import main, parse_args
parser = parse_args()
args = parser.parse_args([]) # note the square bracket
# to overwrite default, use parser.parse_args(['--input', 'foobar.txt'])
print(args) # Namespace(input='my_input.txt')
main(args)


文章来源: In Python, can I call the main() of an imported module?