1

我正在通过 bash 包装器调用 python 脚本,但在处理包含引号空格的参数时遇到了麻烦。

我将python脚本的参数组装成一个bash变量,例如

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

然后使用以下命令调用 python 脚本:

python test_args.py $opt

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

['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'"]

还有其他想法吗?

4

3 回答 3

4

使用数组,但将每个参数作为单独的元素存储在数组中:

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

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

请参阅BashFAQ #050

于 2013-01-31T15:17:03.360 回答
0

这就是shlex模块的用途。

shlex 类可以很容易地为类似于 Unix shell 的简单语法编写词法分析器。这对于编写小型语言(例如,在 Python 应用程序的运行控制文件中)或解析带引号的字符串通常很有用。

于 2013-01-31T14:55:34.450 回答
-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 (aka -/+o noglob) 以禁用文件通配,尽管这在 OP 的示例中不是问题,这不是 eval 的闻所未闻的问题。(另一个更强烈的警告是永远不要评估用户输入,除非你非常小心以确保它不会爆炸成令人讨厌的东西。如果你不控制被评估的值,你不能确定什么会发生。)

于 2013-01-31T15:24:16.883 回答