【问题标题】:python subprocess calling bash script - need to print the quotes out toopython子进程调用bash脚本 - 也需要打印引号
【发布时间】:2011-06-15 11:04:56
【问题描述】:

我在子流程和打印报价方面遇到问题。

我的 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 的值周围。

关于我在哪里使用正确方法的任何指针?

谢谢。

【问题讨论】:

  • 我想我们今天已经遇到了这个错误。是什么让人们认为这是远程有效的语法?列表项用逗号、句点分隔。而空白foo 与字符串"foo" 无关。 (另外:我不能很好地引用你引用的例子,你介意给出一个行号吗?)

标签: python bash subprocess


【解决方案1】:

这是一个列表,里面是字符串,所以需要引号:

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

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

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

【讨论】:

  • 我相信subprocess 会在必要时添加引号 - 如果它完全通过外壳(我认为有一些方法可以调用程序并指定不需要粘合的参数一个大字符串中的可执行名称和参数将由某个 shell 解析;))
  • 在这种情况下实际上并非如此。如果您使用的是 shell=True,那么 subprocess 会让 shell 找出引号。这实际上就是您在命令行上键入的内容。
  • @Ken:你说得对,我错过了 shell=True 参数的使用。
【解决方案2】:

当 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”作为一个参数传递给您的脚本。如果它们是单独的参数,请将它们设为单独的列表元素。

【讨论】:

  • 不使用shell=True 的另一个原因是它可能不安全,具体取决于输入的来源。可以向它输入将在您的系统上执行其他命令的输入。
  • 在没有 shell=True 的情况下无法使其工作,但这确实有效。 subprocess.Popen(['myscript.sh "%s" %s ' % (varfilter, thepath)], shell=True, executable="/bin/bash"
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2013-09-26
    • 2021-04-09
    • 2013-12-23
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 2017-09-27
    • 2013-04-23
    • 2012-06-05
    相关资源
    最近更新 更多