Python 2.6:包含 python 变量的管道 bash 命令(在 python 脚本中)

Python 2.6 : piping bash commands containing python variables(inside python script)

我想从我的 python 脚本中 运行 以下 bash 命令:

stat --printf='%U%G%a' /tmp/file1.csv &&md5sum /tmp/file1.csv |awk '{print }'

我已经使用 subprocess.Popen 完成了,如下所示:

Command=subprocess.Popen(["stat --printf='%U%G%a' file1.csv &&md5sum file1.csv|awk '{print }'"],stdout=subprocess.PIPE,shell=True)

但是我需要传递一个 python 变量,而不是对文件名进行硬编码。我试过了

filevar="/tmp/file.csv"
Command=subprocess.Popen(["stat --printf='%U%G%a' filevar &&md5sum filevar|awk '{print }'"],stdout=subprocess.PIPE,shell=True)

但是上面的代码不起作用。

我已经完成了与 How to pass a python variable to subprocess

相关的所有答案

到目前为止我得到的最佳答案是piping python variable value to bash script (inside python script)

基于此我尝试了:

Command=subprocess.Popen(["stat","--printf='%U%G%a'",filevar],stdout=subprocess.PIPE)

效果很好。但是当我尝试包含更多命令时 md5sum 它会抛出错误。

Command=subprocess.Popen(["stat","--printf='%U%G%a'",filevar,"&&","md5sum",filevar],stdout=subprocess.PIPE)

请建议如何做到这一点。

当您调用 Popen 时,您只需将一个字符串传递给该函数。因此,您可以使用字符串格式将正确的变量放在那里:

filevar="/tmp/file.csv"
Command=subprocess.Popen(["stat --printf='%U%G%a' %(filevar) &&md5sum filevar|awk '{print }'" % {"filevar": filevar}],stdout=subprocess.PIPE,shell=True)

要支持空格和其他 shell 元字符,请使用 pipes.quote():

#!/usr/bin/env python
import pipes
from subprocess import check_output

path = "/path/to/file.csv"
output = check_output("stat --printf='%U%G%a' {path} && md5sum {path}"
                      .format(path=pipes.quote(path))
                      + "|awk '{print }'", shell=True)

要在 Python 2.6 上获得 check_output(),请参阅 What's a good equivalent to python's subprocess.check_call that returns the contents of stdout?

注意:pipes.quote()不是防弹的。不要将 path 传递给 shell,除非它来自受信任的来源,否则您将面临执行任意 shell 命令的风险 (shell injection).

作为替代方案,您可以 use plumbum to emulate the pipeline:

#!/usr/bin/env python
from plumbum.cmd import stat, md5sum, awk  # $ pip install plumbum

path = "/path/to/file.csv"
stat["--printf=%U%G%a", path]()
output = (md5sum[path] | awk['{print }'])()

How do I use subprocess.Popen to connect multiple processes by pipes?

根据您的情况,在没有外部命令的情况下在纯 Python 中实施命令可能是有意义的。