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

在Python中,我有一个模块mymodule.py,其中定义了一些函数和一个main(),它接受一些命令行参数。

我通常从bash脚本调用这个main()。现在,我想把所有的东西都放在一个小的包中,所以我想也许我可以把我的简单bash脚本转换成一个python脚本,然后把它放在包中。

那么,我如何从myformerbashscript.py的main()函数调用mymodule.py的main()函数呢?我能做到吗?我该如何向它传递任何参数?

如果您已经导入了mymodule,那么您应该能够调用myModule.main()。到目前为止你试过什么?

我担心输入参数,这通常是从shell脚本传递的。

用subprocess模块调用它有意义吗?

我想会更容易,是的。

这只是一个函数。导入并调用它:

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 filename.py运行python文件时,没有使用import语句,所以python调用模块"__main__"。但是,如果同一个filename.py代码被视为一个模块(import filename),那么python将它用作模块名。在这两种情况下,都设置了变量__name__,并针对该变量进行测试,以了解代码是如何运行的。

当然。但是输入参数呢?我使用argparse,所以当我从终端调用脚本时,我使用$ python myModule -a input_a -b input_b --parameterC input_c。它如何在Python代码中工作?这是我在简单搜索中找不到的。

@Rickyrobinson:扩展以显示您可以同时使用这两种方法;只需传入已解析或将要解析的参数。

谢谢。您还可以指定哪个代码摘录属于哪个模块或脚本吗?它看起来比我刚开始想的要笨重得多。

@里克罗宾森:两个摘录都属于同一个模块,我已经把这一点讲得很清楚了。

马蒂金的回答是有道理的,但它遗漏了一些重要的东西,这些东西对其他人来说可能是显而易见的,但对我来说很难弄清楚。

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

args = parser.parse_args(args)

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

args = parser.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

这正是我需要的-非常感谢你提供的有用的附录

这要看情况而定。如果主代码受if保护,如:

if __name__ == '__main__':

...main code...

不,您不能让python执行它,因为您不能影响自动变量__name__。

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

import myModule

myModule.main()

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

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

哦,好的,谢谢你的澄清。我把所有东西都放在main()函数中,所以应该可以。我更关心的是如何将输入参数传递给这个"第二"主函数。有什么简单的方法吗?

当然可以:import sys; module.main(sys.argv);。

这是访问__main__的另一个很好的解释,它帮助了我,谢谢@aarondigulla

下面是从另一个函数调用main的技巧:stackoverflow.com/a/20158605/3244382

我也同样需要使用argparse。这就是argparse.ArgumentParser对象实例的parse_args函数,它默认地从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:])

关键是将args传递给parse_args函数。稍后,要使用主,您只需按照Martijn所说的做。

我在这里搜索的答案是:如何将python argparse与sys.argv之外的参数一起使用?

如果用这种方式编写main.py和parse_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()并在另一个python脚本中使用parser.parse_args(['--input', 'foobar.txt'])解析参数:

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

假设您也在尝试传递命令行参数。

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:])

谢谢。我实际上使用的是argparse,而不是sys.argv。在这种情况下它将如何改变?另外,在外部脚本中,我只想向用户输入一些输入参数,而内部脚本(mymodule.py)的其他输入参数则由我硬编码。

如果没有看到代码本身,就很难回答具体的问题。一般来说,你只需要通过任何论据。*解包了一个数组f(a) => f([1,2,3])对f(*a) => f(1,2,3)的解包,你也可以很容易地完成myModule.main(sys.argv[1],"other value", 39)或其他操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值