Ошибка Python OS.popen - PullRequest
       12

Ошибка Python OS.popen

0 голосов
/ 09 декабря 2011

Я пытаюсь получить несколько имен файлов, выполнив эту команду в 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 для

Ответы [ 2 ]

3 голосов
/ 09 декабря 2011

Для этой конкретной проблемы вы можете использовать нативные вызовы 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)

См. «Замена конвейера оболочки» .

PS,subprocess.Popen имеет параметр shell=True, который также можно использовать.Однако лучше по возможности избегать использования shell=True. Это угроза безопасности .

1 голос
/ 09 декабря 2011

Вы можете использовать subprocess.Popen, с shell = True flags:

from subprocess import Popen, PIPE
lscmd = "ls /etc/tor/statistiekjes/ |egrep "+FILE
inputList = Popen(lscmd, shell=True, stdout=PIPE).communicate()[0]
print inputList

Наслаждайтесь.

...