#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