【发布时间】:2016-07-22 15:28:52
【问题描述】:
我知道以前有人问过类似的问题,但它们似乎都已通过重新设计参数的传递方式(即使用列表等)得到解决。
但是,我这里有个问题,我没有那个选项。有一个特定的命令行程序(我使用的是 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\'"),但没有得到任何输出。
我知道这被认为是不好的做法,因为它难以解释,但我没有其他选择。有什么想法吗?
【问题讨论】:
-
代替
quoted_argument,你能告诉我们你实际输入命令的字符串吗?令人费解的是,您的示例是command -flag 'foo foo1'但self.commands有不同的标志。但是......只是做quoted_argument = "foo foo1"(即完全删除引号)应该可以工作。 -
或者,只使用 shell
Popen("command -flag 'foo foo1'", shell=True)。 -
我试图用命令概括,实际命令有点不同。我实际上正在获取一个列表并将其连接到引用的参数中,因此显示起来有点复杂。如果我不需要,我也不想连接 shell=True 的字符串。我会尝试删除引号。
-
@tdelaney 删除引号似乎可行,谢谢。您可以将其作为答案,我会接受,或者如果您愿意,我可以自己做。
标签: python bash shell subprocess quotes