Подпроцесс не захватывает выходные данные стандартного вывода, сохраняя его внутри переменной в Python

#python #python-2.7

#python #python-2.7

Вопрос:

Я попробовал приведенный ниже код для захвата вывода с экрана с помощью подпроцесса, но он не выполняет то, что я намеревался сделать.

 #!/tools/bin/python

import subprocess

result = subprocess.check_output("echo $USERNAME", shell=True)
print result
 

ожидаемый результат:

 vimo 
vimo 
 

т.е. один для процесса echo и один для вывода результата.
Но то, что я вижу, это

 vimo
 

Но когда я пытаюсь распечатать результат вывода, он всегда пуст.

Чего мне не хватает в приведенной выше головоломке!! Помогите!!

Комментарии:

1. родительский процесс захватывает стандартный вывод дочернего процесса. Таким образом, результат вполне ожидаемый

2. Чего вы пытаетесь достичь?

3. О! извините.. запутался и подумал, что он будет печатать два вывода.. но потом я понял, что значение, которое хранится в переменной, распечатывается.

Ответ №1:

Здесь вы получаете несколько сильно урезанных (и измененных по соображениям конфиденциальности) необработанных фиктивных фрагментов кода, извлекающих как stdin, так и stdout из вывода внешнего скрипта.

 from subprocess import Popen, PIPE

cmd = ['echo', 'foo']

proc = Popen(cmd, stdout=PIPE, stderr=PIPE)
comm = proc.communicate()

if proc.returncode != 0:
    # code to handle / parse stderr (comm[1])
    raise RuntimeError(
        ''%s': command has failed (%d):n%s'
        % ('some value', proc.returncode, comm[1]))

for line in comm[0].split('n'):
    if line.find('Wrote:') == 0:
        # some code to parse stdout
        pass
 

Ответ №2:

Python> = 3.7 (протестировано с Python 3.9)

 
r=subprocess.run(['echo','$XDG_DATA_HOME'],capture_output=True,shell=True)
assert r.stdout.find(b'share')>0 # ERROR
r=subprocess.run('echo $XDG_DATA_HOME',capture_output=True,shell=True)
assert r.stdout.find(b'share')>0 # OK