【问题标题】:Calling script with tuples as arguments使用元组作为参数调用脚本
【发布时间】:2019-06-07 03:49:53
【问题描述】:

我希望能够像这样从命令行调用 python 脚本:

python ./pyProg (1, 2) (2, 3)

然后能够在我的程序中操作这些(输入任意数量,例如可以输入 10 个元组)?

到目前为止,我能够做类似事情的唯一方法就是这样称呼它:

python ./pyProg 1,4 2,2

或:

python ./pyProg "(1, 2)" "(2,2)"

它们以字符串的形式出现.. 实现我想做的最好的方法是什么?

谢谢

【问题讨论】:

  • 您只能将字符串作为命令行参数传递。您的操作系统不知道 Python 元组或其大多数其他数据类型。您可以将它们全部作为单个字符串传递,然后将其解析为您的脚本代码的元组。
  • @martineau 好的,最干净的方法是传入字符串,然后在 prog 中转换为元组?即我在帖子中的第二种方式^^?
  • 是的,这会起作用,或者您只需将它们都作为单个字符串传递:即"(1, 2) (2, 2)",这将需要更少的输入。

标签: python command-line arguments tuples


【解决方案1】:

您可以将元组作为字符串传递并使用ast.literal_eval() 将它们转换为实际的元组:

from sys import argv
from ast import literal_eval

for x in argv[1:]:
    tup = literal_eval(x)
    print(tup, type(tup))  

可以这样调用:

$ python ./pyProg.py "(1, 2)"
(1, 2) <class 'tuple'>

处理错误:

如果传递的字符串不是有效的表达式,SyntaxErrorValueError 都可以被引发。因此,将上述内容包装在try/except 中可能是安全的:

from sys import argv
from ast import literal_eval

for x in argv[1:]:
    try:
        tup = literal_eval(x)
        print(tup, type(tup))
    except (SyntaxError, ValueError):
        print("%s -> Invalid tuple format given" % x)

可以在这里看到:

$ python ./pyProg.py "(1, 2"
(1, 2 -> Invalid tuple format given
$ python ./pyProg.py "(1, 2) (1, 2)"
(1, 2) (1, 2) -> Invalid tuple format given

【讨论】:

    【解决方案2】:

    如果您希望参数采用特定格式,那么如果您使用解析单个值的常规参数处理解析器,可用性可能会更好。

    arg_tuples = [tuple(t.split(',') for t in sys.argv[1:]]
    

    省略括号允许您在 shell 命令行上省略引号(尽管如果您的元组成员不总是数字,则出于其他原因当然可能需要引号)。

    sys.argv[] 是定义的字符串列表,shell 没有(可移植的)任何其他数据类型。

    【讨论】:

      猜你喜欢
      • 2017-05-01
      • 2016-05-02
      • 2020-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多