簡體   English   中英

從包含引用空格的shell變量傳遞參數到Python腳本

[英]Passing arguments to a Python script from a shell variable containing quoted spaces

我通過bash包裝器調用python腳本,但是我在處理包含引用空格的參數時遇到了麻煩。

我將python腳本的參數組裝成一個bash變量,例如

opt="-c start.txt"
opt+="--self 'name Na'"

然后調用python腳本,例如:

python test_args.py $opt

在Python中打印sys.argv時,我得到了

['test-args.py', '-c', 'start.txt', '--self', "'name", "Na'"]

而不是預期的

['test-args.py', '-c', 'start.txt', '--self', 'name Na']

我在調用腳本時嘗試使用數組,例如

python test_args.py ${opt[@]}

但后來我明白了

['test-args.py', "-c start.txt --self 'name Na'"]

還有其他想法嗎?

使用數組,但將每個參數存儲為數組中的單獨元素:

opt=(-c start.txt)
opt+=(--self 'name Na')

python test_args.py "${opt[@]}"

參見BashFAQ#050

這就是shlex模塊的用途。

shlex類使得為類似於Unix shell的簡單語法編寫詞法分析器變得容易。 這對於編寫小語言(例如,在Python應用程序的運行控制文件中)或解析引用的字符串通常很有用。

你在變量的值中嵌入空格的直覺是好的,但是當在命令行解析期間簡單地擴展它們時,它們的特殊含義就會丟失。 您需要在解析python腳本的命令行之前展開變量:

set -f
eval python test_args.py $opt
set +f

這將擴展到:

python test_args.py -c start.txt --self 'name Na'

然后將使用引號重新獲得其特殊含義來正確解析。

編輯:我在eval周圍添加了set -f / + f(aka - / + o noglob)來禁用文件通配,盡管這不是OP的例子中的問題,這不是eval的問題。 (另一個更強有力的警告是永遠不會減少用戶輸入,除非你非常小心地確保它不會被炸成令人討厭的東西。如果你不控制價值被評估,你不能確定會是什么發生。)

暫無
暫無

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

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