通过命令行传递Python变量?

Jon*_*han 3 python command-line command-line-arguments

我是Python的新手(就像昨天一样),如果我不知道"显而易见的",请耐心等待.

有两种方法,我可以去这个问题,并且或者将工作对我很好,我不知道是否getoptoptparse包含(从我读什么)我想/需要什么?我想做类似以下的事情:

python this.py --variable VariableName="Value" -v VariableName2="Value2"
Run Code Online (Sandbox Code Playgroud)

要么

python this.py --VariableName "Value"
Run Code Online (Sandbox Code Playgroud)

我面临的主要问题是我可能需要可选地传递任何变量,但不一定全部和任何特定顺序(ergo,raw sys.argv在我的情况下不起作用).对于其中一些变量,我可能会传递字符串,数字和/或数组.

一旦变量在脚本中传递,我将需要检查它们是否设置为非空,并根据需要分配默认值.

谢谢!

mgi*_*son 7

你肯定需要一个命令行参数解析器.Python附带了一些.Python2.7 argparse可以根据需要反向移植到早期版本,这是我建议的.还有optparse.它不是那么好argparse,但它仍然可以做得很好,可用于较旧的python版本以及较新的版本.

还有getopt,但与其他人相比,这一点几乎不值得一提.


Jon*_*han 2

我将首先回答我自己的问题。

尽管我很喜欢@mgilson 给出的答案,但我找到了一种“更简单”的方法。我对正则表达式非常熟悉,并且找出关联数组(即字典)并不太困难。

import re

args = {}
args['pythonFile'] =  sys.argv[0]

for arg in sys.argv[1:]:
  variable = re.search('\-\-(.*)\=',arg)
  variable = variable.group(1)
  value = re.search('\=(.*)',arg)
  value = value.group(1)
  args[variable] = value

print args
Run Code Online (Sandbox Code Playgroud)

证明如下:

$ /opt/python27/bin/python2.7 Test.py --var1=1 --var2="Testing This"
{'var1': '1', 'pythonFile': 'Test.py', 'var2': 'Testing This'}
Run Code Online (Sandbox Code Playgroud)

哇!

  • 先学后做或立即做任何可行的事情之间的正确平衡取决于解决问题的需要与学习工具的需要之间的平衡。但我想这适用于每个问题与工具的关系......(深度优先搜索可能会瘫痪......) (3认同)
  • 虽然这听起来非常聪明(确实),但从我所看到的情况来看,也许这不是实现你真正想要的东西的最“pythonic”方式。不过不用担心,你很快就会吸收Python的特性,并且用得越多就越自然。 (2认同)