我试图通过在os.popen中执行此命令来获取一些文件名:
ls /etc/tor/statistiekjes/ |egrep dns
但是当我运行我的脚本时,我得到了:
<open file 'ls /etc/tor/statistiekjes/ |egrep dns', mode 'r' at 0xb7786860>
egrep: write error: Broken pipe
代码:
lscmd = "ls /etc/tor/statistiekjes/ |egrep "+FILE
print lscmd
inputList=os.popen(lscmd,'r')
文件是脚本上的参数,用于grep on
答案 0 :(得分:3)
对于这个特殊问题,您可以使用本机Python调用:
import os
import re
for name in (name for name in os.listdir('/etc/tor/statistiekjes/')
if re.search(FILE,name)):
print(repr(name))
但是,您可能正在寻找一种更通用的解决方案来调用外部程序。在这种情况下,请使用subprocess
代替os.popen
,因为os.popen
已被弃用:
import subprocess
import shlex
proc1 = subprocess.Popen(shlex.split('ls /etc/tor/statistiekjes/'),
stdout=subprocess.PIPE)
proc2 = subprocess.Popen(shlex.split('egrep {pat}'.format(pat=FILE)),
stdin=proc1.stdout,
stdout=subprocess.PIPE,stderr=subprocess.PIPE)
proc1.stdout.close() # Allow proc1 to receive a SIGPIPE if proc2 exits.
out,err=proc2.communicate()
print(out)
请参阅"Replacing shell pipeline"。
PS。 subprocess.Popen
有一个shell=True
参数也可以使用。但是,如果可能,最好避免使用shell=True
。 It is a security risk
答案 1 :(得分:1)
您可以使用subprocess.Popen,shell = True标志:
from subprocess import Popen, PIPE
lscmd = "ls /etc/tor/statistiekjes/ |egrep "+FILE
inputList = Popen(lscmd, shell=True, stdout=PIPE).communicate()[0]
print inputList
享受。