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 中实施命令可能是有意义的。
我想从我的 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 中实施命令可能是有意义的。