如何通过子进程传递具有空格的参数?

时间:2018-01-16 07:41:50

标签: python shell subprocess

我有一个调用另一个shell脚本的Python脚本 -

arg1 = "-a"
arg2 = "-b"
arg3 = "Some String"

argList = ["script.sh", arg1, arg2, arg3]
subprocess.call(argList)

当我运行脚本时,arg3被分割为"Some""String",并作为两个单独的参数传递。

如何克服这个问题,将"Some String"作为一个参数传递?

编辑:已解决

我通过将参数传递为$ 1,$ 2,$ 3等来调用被调用脚本内部的另一个函数。当我应该引用可能有$ 1,$ 2,$ 3等空格的参数时..抱歉,我们很抱歉。

4 个答案:

答案 0 :(得分:1)

这应该有效:

import subprocess

arg1 = "-a"
arg2 = "-b"
arg3 = "Some String"

argList = ["sh", "script.sh", arg1, arg2, arg3]

subprocess.call(argList)

script.sh

printf '%s\n' "$@"

确保引用"$@"以避免在shell脚本中进行单词拆分。

这将输出:

-a
-b
Some String

答案 1 :(得分:0)

转义双引号,

arg3 = "\"Some String\""

答案 2 :(得分:0)

试试这个:

import shlex, subprocess
args=shlex.split('script.sh -a -b "Some String"')
subprocess.Popen(args)

答案 3 :(得分:0)

这是一个扩展的评论,而不是一个答案。

您的代码在我的Debian 9.3中运行良好

$ cat sc.sh
#!/bin/sh
# Above line is mandatory - otherwise python returns error of unkonwn format
echo "arg1=$1"
echo "arg2=$2"
echo "arg3=$3"
echo "arg4=$4"

$ chmod +x sc.sh

$ pwd
/home/gv

$ cat test.py
import subprocess
arg1 = "-a"
arg2 = "-b"
arg3 = "some string"

arglist = ["/home/gv/sc.sh", arg1, arg2, arg3]
subprocess.call(arglist)

$ python test.py
arg1=-a
arg2=-b
arg3=some string
arg4=

PS:在我的系统中安装了python 2.17.14和bash 4.4.12