2013-08-18 59 views
0

这是我的程序(test.py):如何使用python的命令行shell传递命令行选项?

#!/usr/bin/python 
import sys, getopt 
def main(argv): 
    inputfile = '' 
    outputfile = '' 
    try: 
     opts, args = getopt.getopt(argv,"hi:o:",["ifile=","ofile="]) 
    except getopt.GetoptError: 
     print 'test.py -i <inputfile> -o <outputfile>' 
     sys.exit(2) 
    for opt, arg in opts: 
     if opt == '-h': 
     print 'test.py -i <inputfile> -o <outputfile>' 
     sys.exit() 
     elif opt in ("-i", "--ifile"): 
     inputfile = arg 
     elif opt in ("-o", "--ofile"): 
     outputfile = arg 
    print 'Input file is "', inputfile 
    print 'Output file is "', outputfile 

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

使用MS-DOS命令行中,我可以通过这样的-h选项(在test.py定义):

python test.py -h   

在MSDOS命令行会那么输出中这样:

test.py -i <inputfile> -o <outputfile> 

但我怎么会在python interactive 模式中通过-h选项,就像使用msdos命令行一样?

回答

1

可能是你可以尝试破解一些带有自定义sys.argv但这将是太哈克,使用代替:

>>> from subprocess import call 
>>> call(['./test.py', option1, option2, ...]) 
0

if __name__ == "__main__":线的整体思路是,这个文件可以既使用作为一个程序和一个模块。

所以做到这一点:

>>> import test 
>>> test.main(['-h']) 

如果你的模块不会有__name__检查你可以做只是分配给sys.argv

>>> import sys 
>>> sys.argv = ['-h'] 
>>> import test 

但自然,只会工作的第一次模块被加载。在接下来的运行,你需要运行:

>>> reload(test) 

注:在Python2 reload是内置的,但在Python3它是在模块imp