Python OS.popen错误

时间:2011-12-09 13:06:11

标签: python popen

我试图通过在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

2 个答案:

答案 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=TrueIt 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

享受。