将数组作为命令行参数传递给脚本

时间:2018-04-08 00:02:53

标签: python-3.x

我想从命令行试验代码,因此请argv形成sys

    from sys import argv
    def binary_search(array, item):
        low = 0
        high = len(array) - 1
        while low <= high:
            mid = (low + high) // 2 # round down if not an even 
            guess = array[mid]
            if guess == item:
                return mid
            if guess > item:
                high = mid - 1
            else:
                low = mid + 1
        return None

    def main():
        script, array, item = argv
        binary_search(array, item)

在命令行上运行时:

    $ python3 binary_search.py [1, 2, 3] 8
    Traceback (most recent call last):  File "binary_search.py", line 94, in <module>
        main()  File "binary_search.py", line 89, in main
        script, array, item = argvValueError: too many values to unpack (expected 3)

我测试过并发现从命令行传递的参数被argv视为str。

如何将数组作为参数传递?

2 个答案:

答案 0 :(得分:1)

有几种不同的方法可以做到这一点......

使用re

使用正则表达式可能是处理此问题的最简单方法之一。

from sys import argv
import re

def binary_search(array, item):
    low = 0
    high = len(array) - 1
    while low <= high:
        mid = (low + high) // 2 # round down if not an even 
        guess = array[mid]
        if guess == item:
            return mid
        if guess > item:
            high = mid - 1
        else:
            low = mid + 1
    return None

def main():
    array = re.findall(r"[\w]+", argv[1])
    array = [int(i) for i in array]
    item = int(argv[2])

    binary_search(array,item)


if __name__== "__main__":
    main()

使用exec()

您还可以使用exec(),这可能更具风险和复杂性。这是一个简单的例子:

from sys import argv

command = 'mylist = {0}'.format(argv[1])

exec(command)

for item in mylist:
    print(item)

示例输出:

C:\path>py foo.py [1,2,3]
1
2
3

答案 1 :(得分:0)

命令行上的参数是字符串,它们不像程序中的文字那样被解析。

argv自动将字符串构造成命令行参数列表(以空格分隔),简而言之, textCountLabel.text = yourUpdatedString textCountLabel.sizeToFit() 是一个列表。

此外,模块argparse有帮助

  

argparse模块可以轻松编写用户友好的命令行界面。程序定义了它需要的参数,argparse将弄清楚如何解析sys.argv中的参数。当用户给程序提供无效参数时,argparse模块还会自动生成帮助和使用消息并发出错误。