2012-02-25 113 views
9
from sys import argv 
script, lira_cbt, [eur_hedge] = argv 

if eur_hedge == None: 
    #Do x 
else: 
    #Do y 

我希望它能够以lira_cbt作为参数(做x)或者同时使用lira_cbt和eur_hedge(做y)来运行。这可以通过sys.argv来实现吗?sys.argv可以处理可选参数吗?

+1

如果CLI获取复杂的,(如果你坚持一些旧版本或'optparse')你或许应该开始使用'argparse'。 – delnan 2012-02-25 10:01:13

回答

15

只需使用的sys.argv

if len(sys.argv) == 2: 
    # do X 
else: 
    # do Y 
2

您可以简单地检查sys.argv的长度。

if len(sys.argv) < 2: 
    # Error, not enough arguments 

lira_cbt = sys.argv[1] 
if len(sys.argv) == 2: 
    # Do X 
else: 
    eur_hedge = sys.argv[2] 
    # Do Y 
+0

但没有办法专门拉eur_hedge中的值,而不会抛出一个需要更多/太多变量来解压缩参数? – Felix 2012-02-25 07:58:54

+2

不,没有办法做到这一点,除非你想将它转换为函数调用并使用类似'def main(script,lira_cbt,eur_hedge = None)'和'main(* sys.argv)'这样的东西我绝对不会这样做。 – 2012-02-25 08:00:57

1

另一种选择是使用try来提取argv列表中的值长度:

lira_cbt = sys.argv[1] 
try: 
    eur_hedge = sys.argv[2] 
except IndexError: 
    eur_hedge = None 

if eur_hedge == None: 
    # Do X 
else: 
    # Do Y 

你也可以看看getopt为一个更灵活的命令行参数解析器。

+2

optparse或argparse会比getopt好得多! – carl 2012-02-25 08:46:53

5

如果这是要的不是扔掉的脚本的详细部分,可以考虑使用argparse http://docs.python.org/library/argparse.html

目前,它会更加复杂,但它会帮助你保持记录的程序接受的选项和也提供有用的错误消息,而不像 “解包太多值”,用户可能不理解。

0

如果我可以建议另一种方法:

from sys import argv 
option_handle_list = ['--script', '--lira_cbt', '--eur_hedge'] 
options = {} 
for option_handle in option_handle_list: 
    options[option_handle[2:]] = argv[argv.index(option_handle) + 1] if option_handle in argv else None 
if options['eur_hedge'] == None: 
    #Do x 
else: 
    #Do y 
+0

虽然这可能会奏效,但使用像'argparse'这样的模块来完成这个任务将会更容易,更麻烦。 – YSelf 2017-12-15 23:39:10

+0

@YSelf我不是在讨论更简单/更传统的解决方案。只是回答原来的问题。 – 2017-12-16 19:07:22