Python子流程:无法逃脱引号

时间:2016-04-02 23:16:30

标签: python bash shell subprocess quotes

我之前已经知道类似的问题,但它们似乎都通过重新处理参数的传递(即使用列表等)来解决。

但是,我有一个问题,我没有这个选项。有一个特定的命令行程序(我正在使用Bash shell),我必须传递一个带引号的字符串。它不能没有引用,它不能有一个复制的参数,它只需要单引号或双引号。

command -flag 'foo foo1'

我无法使用command -flag foo foo1,也无法使用command -flag foo -flag foo1。我认为这是对命令如何编程接收输入的疏忽,但我无法控制它。

我传递的论点如下:

self.commands = [
                self.path,
                '-flag1', quoted_argument,
                '-flag2', 'test',
                ...etc...
                ]
process = subprocess.Popen(self.commands, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
results = process.communicate(input)

quoted_argument就像'foo foo1 foo2'。 我试图转义单引号("\'foo foo1 foo2\'"),但我没有输出。

我知道这被认为是不好的做法,因为解释起来很模糊,但我没有其他选择。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

shell将命令字符串分解为列表。引号告诉shell将多个单词放入单个列表项中。由于您自己构建列表,因此将单词添加为单个项目而不添加引号。

这两个Popen命令是等效的

Popen("command -flag 'foo foo1'", shell=True)
Popen(["command", "-flag", "foo foo1"])