簡體   English   中英

將數組作為命令行參數傳遞給腳本

[英]Pass an array as command line argument to the script

我想從命令行實驗代碼,所以導入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。

如何將數組作為參數傳遞?

有幾種不同的方法可以做到這一點......

使用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

命令行上的參數是字符串,它們不像程序中的文字那樣被解析。

argv從命令行參數自動構造字符串到列表(由空格分隔),簡而言之, sys.argv是一個列表。

另外,模塊argparse有幫助

argparse模塊可以輕松編寫用戶友好的命令行界面。 程序定義了它需要的參數,argparse將弄清楚如何解析sys.argv中的參數。 當用戶給程序提供無效參數時,argparse模塊還會自動生成幫助和使用消息並發出錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM