преобразовать команду os.popen в подпроцесс. Откройте экземпляр - PullRequest
2 голосов
/ 08 марта 2012

Согласно документации по Python http://docs.python.org/library/subprocess.html, рекомендуется заменить os.popen классом Popen, сейчас у меня есть следующая команда:

import os
c = "openssl dgst -sha1 -sign /foo/1 /bar/1 | openssl enc -base64 -A"
my_value = os.popen(c).read()

Я понимаю, что Попен воспринимает команду как список строковых аргументов. Как бы то ни было, когда я пытаюсь передать pipe ("|"), она прерывается, потому что "|" имеет особое значение в bash, однако не уверен, как решить эту проблему.

Другая проблема заключается в том, что в экземплярах Popen нет метода read, поэтому я не уверен, как можно просмотреть вывод.

Я использую Django Framework, поэтому, если в платформе есть также функция, которая может помочь, это тоже вариант.

Ответы [ 2 ]

4 голосов
/ 08 марта 2012

Если вы посмотрите на раздел Замена конвейера оболочки в документации, вы увидите, что ваш пример можно написать следующим образом, используя subprocess:

from subprocess import Popen, PIPE                                        
p_dgst = Popen("openssl dgst -sha1 -sign /foo/1 /bar/1".split(),
               stdout=PIPE)
p_enc =  Popen("openssl enc -base64 -A".split(),
               stdin=p_dgst.stdout, stdout.PIPE)
my_value = p_enc.communicate()[0]
2 голосов
/ 08 марта 2012

Чтобы получить подпроцесс для запуска конвейеров оболочки, используйте параметр shell=True:

subprocess.Popen(command, shell=True)
...