我通过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'"]
还有其他想法吗?
答案 0 :(得分:3)
使用数组,但将每个参数存储为数组中的单独元素:
opt=(-c start.txt)
opt+=(--self 'name Na')
python test_args.py "${opt[@]}"
请参阅BashFAQ #050。
答案 1 :(得分:0)
这是shlex模块的用途。
shlex类可以轻松编写简单的词法分析器 类似于Unix shell的语法。这通常很有用 用于编写小语言,(例如,在运行控制文件中) Python应用程序)或解析引用的字符串。
答案 2 :(得分:-1)
你在变量值中嵌入空格的直觉是好的,但是当在命令行解析期间简单地扩展它们时,它们的特殊含义就会丢失。您需要在解析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(又名 - / + o noglob)以禁用文件通配,尽管这不是OP示例中的一个问题,并不是eval的问题。 (另一个更强有力的警告是永远不会减少用户输入,除非你非常小心地确保它不会被炸成令人讨厌的东西。如果你不控制价值被评估,你不能确定会是什么发生。)