Python подпроцесс readlines ()? - PullRequest
       6

Python подпроцесс readlines ()?

14 голосов
/ 19 сентября 2011

Поэтому я пытаюсь перейти от os.popen к subprocess.popen, как рекомендовано в руководстве пользователя.Единственная проблема, с которой я столкнулся, это то, что я не могу найти способ заставить readlines () работать.

Так что я имел обыкновение делать

list = os.popen('ls -l').readlines()

Но я могуне делай

list = subprocess.Popen(['ls','-l']).readlines()

Ответы [ 5 ]

32 голосов
/ 19 сентября 2011
ls = subprocess.Popen(['ls','-l'], stdout=subprocess.PIPE)
out = ls.stdout.readlines()

или, если вы хотите читать построчно (возможно, другой процесс более интенсивен, чем ls):

for ln in ls.stdout:
    # whatever
26 голосов
/ 19 сентября 2011

С subprocess.Popen, используйте communicate для чтения и записи данных:

out, err = subprocess.Popen(['ls','-l'], stdout=subprocess.PIPE).communicate() 

Тогда вы всегда можете отделить строку от процессов stdout с помощью splitlines().

out = out.splitlines()
11 голосов
/ 19 сентября 2011
3 голосов
/ 20 сентября 2011

Более подробный способ использования подпроцесса.

        # Set the command
        command = "ls -l"

        # Setup the module object
        proc = subprocess.Popen(command,
                            shell=True,   
                            stdin=subprocess.PIPE,
                            stdout=subprocess.PIPE,
                            stderr=subprocess.PIPE)

        # Communicate the command   
        stdout_value,stderr_value = proc.communicate()

        # Once you have a valid response, split the return output    
        if stdout_value:
            stdout_value = stdout_value.split()
3 голосов
/ 19 сентября 2011
list = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE).communicate()[0].splitlines()

прямо с help(subprocess)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...