我遇到子进程和打印引号的问题。
我的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的值周围,就像第一个例子一样。
关于我正在采用正确方法的地方的任何指示?
谢谢。
答案 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"]