2012-03-07 2 views
2

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

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

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

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

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

ответ

3

Если вы посмотрите на раздел в документации Replacing the shell pipeline, вы увидите, что ваш пример может быть записан следующим образом с помощью 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] 
+1

Есть ли какая-либо документация, почему «os.popen» следует заменить? Вышеприведенный код выглядит более сложным, чем простой вызов 'os.popen'. –

2

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

subprocess.Popen(command, shell=True) 
Смежные вопросы