在Python我有一个模块 myModule.py其中I定义几个功能和主(),它需要几命令行参数。
我通常称之为主()从一个bash脚本。 现在,我想把一切都成小包装 ,所以我想,也许我可以把我的简单的bash脚本到一个Python脚本,并把它放在包中。
所以,实际上,我怎么从 MyFormerBashScript.py 的main()函数 调用 myModule.py 的main()函数? 我甚至可以这样做吗? 我如何传递任何参数呢?
在Python我有一个模块 myModule.py其中I定义几个功能和主(),它需要几命令行参数。
我通常称之为主()从一个bash脚本。 现在,我想把一切都成小包装 ,所以我想,也许我可以把我的简单的bash脚本到一个Python脚本,并把它放在包中。
所以,实际上,我怎么从 MyFormerBashScript.py 的main()函数 调用 myModule.py 的main()函数? 我甚至可以这样做吗? 我如何传递任何参数呢?
这只是一个功能。 导入并调用它:
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__
设置,并针对测试告诉你,你的代码是如何运行的。
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
这取决于。 如果主代码是由一个受保护的if
在:
if __name__ == '__main__':
...main code...
再不行,你不能让Python的执行是因为你不能影响自动变量__name__
。
但是,当所有的代码是在一个函数,那么或许可以。 尝试
import myModule
myModule.main()
这样,即使在模块保护本身就带有__all__
。
from myModule import *
可能没有main
对你可见,让你真正需要导入模块本身。
我一直在使用同样需要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
功能。 后来,使用主,你只是做的马亭说。
假设你正试图通过命令行参数也是如此。
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:])
答案我正在寻找在这里回答: 如何使用Python argparse比其他参数是sys.argv ARGS?
如果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()
和分析与论证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)