2015-10-21 3 views

ответ

3

Для python-2.7 аргументы не хранятся как в версии 3.3. То, что вам нужно сделать, это либо запомнить их, либо сделать обходной путь.

Одним из способов были бы написать свое собственное Наследование от Popen или просто написать обертку вокруг Popen:

from subprocess import _Popen 

def Popen(*args, **kwds): 
    res = _Popen(*args, **kwds) 

    if not hasattr(res, "args"): 
     res.args = args[0] 

    return res 

, конечно, вы можете хранить все позиционные и именованные аргументы, если вы хотите. До 3.3 атрибут args не используется, но впоследствии он может быть защищен от этого, как показано выше.

Вы даже можете сделать чек один раз (при запуске) и использовать некоторые исправления обезьяны. Вот пример с наследованием:

from sys import version 
import subprocess 

class Popen(subprocess.Popen): 
    def __init__(self, *args, **kwds): 
     subprocess.Popen.__init__(self, *args, **kwds) 
     self.args = args[0] 

if version[0] < 3 or (version[0]==3 and version[1] < 3): # pre 3.3 
    subprocess.Popen = Popen 
3

Если вы используете Python 3, command.args это самый простой способ:

from subprocess import Popen 
command = Popen(['ls', '-l']) 

print command.args 

Выход:

['ls', '-l'] 

Обратите внимание, что выходной список.

+0

Oh! Я получаю следующее: AttributeError: объект «Popen» не имеет атрибута «args», какую версию python вы используете? – Har

+0

@Har Упс, я использую Python 3.5. Извините, я отредактирую свой ответ;) –

+1

@Har Ну, я только что ушел. Кажется, что skyking имеет правильный ответ. –

0

Я иногда так делаю!

import subprocess, 
cmd = ["ls", "-a" ] 
proc = subprocess.Popen(cmd, stdout = subprocess.PIPE) 
stdout = proc.communicate()[0] 
Смежные вопросы