python subprocess调用bash脚本 - 也需要打印引号

时间:2011-01-25 20:14:14

标签: python bash subprocess

我遇到子进程和打印引号的问题。

我的Python脚本接受用户输入,稍微将其混淆 - 我需要它以这种方式将结果发送到bash脚本。

myscript.sh 'var1 == a var2 == b; othervar == c' /path/to/other/files

我被挂断的地方是单引号。 Python试图将它们删除。

我用它进行测试。

subprocess.Popen([myscript.sh 'var=11; ignore all' /path/to/files], shell=True, executable="/bin/bash")

返回指向第二个单引号的无效语法。我也尝试了上面没有括号并使用单引号外部和双引号等等。

其他 - 愿意。

正如我上面所说'var == a var == b; othervar == c'是从python脚本派生的(以字符串格式) - 我需要像这样在子进程中调用它。

subprocess.Popen([myscript.sh myvariables /path/to/files], shell=True, executable="/bin/bash")

我只需将单引号括在myvariables的值周围,就像第一个例子一样。

关于我正在采用正确方法的地方的任何指示?

谢谢。

3 个答案:

答案 0 :(得分:7)

当shell = True传递给Popen时,您将传递在命令行上发送的任何内容。这意味着您的列表应该只有一个元素。例如:

subprocess.Popen(['myscript.sh "var=11; ignore all" /path/to/files'], shell=True, executable="/bin/bash")

或者/ path / to / files是Python环境中的变量:

subprocess.Popen(['myscript.sh "var=11; ignore all" %s' % path_to_files], shell=True, executable="/bin/bash")

说过我强烈鼓励你不要使用shell参数。原因是脆弱。你会得到一个更强大的方法:

subprocess.Popen(["/bin/bash", "myscript.sh", "var=11; ignore all", path_to_files])

请注意,“var = 11; ignore all”作为一个参数传递给您的脚本。如果这些是单独的参数,请将它们作为单独的列表元素。

答案 1 :(得分:2)

我还没有检查为什么会这样,但它确实有,而且不需要shell = True。

subprocess.Popen(["/bin/bash", "myscript.sh", '""' + string_to_be_quoted + '""', path_to_files])

答案 2 :(得分:0)

这是一个列表,其中包含字符串,因此需要引号:

["myscript.sh", "var=11; ignore all", "/path/to/files"]

那应该有用。如果你的脚本真的以某种方式依赖于引号,那么试试这个(我不知道子进程如何工作的细节):

["myscript.sh", "'var=11; ignore all'", "/path/to/files"]