os.system, передающая строку, которая содержит переменную [duplicate]

W3C исключил такой селектор из-за огромного влияния производительности на браузер.

47
задан Peter Mortensen 16 November 2016 в 00:20
поделиться

2 ответа

Лучше использовать communicate :

from subprocess import Popen, PIPE, STDOUT
p = Popen(['myapp'], stdout=PIPE, stdin=PIPE, stderr=PIPE)
stdout_data = p.communicate(input='data_to_write')[0]

«Лучше» из-за этого предупреждения:

Использовать обмениваться (), а не .stdin.write, .stdout.read или .stderr.read, чтобы избежать взаимоблокировок из-за того, что любой из других буферов буферов ОС заполняет и блокирует дочерний процесс.

63
ответ дан jro 18 August 2018 в 00:50
поделиться
  • 1
    aaah great, спасибо, что, если я просто выполняю подпроцесс импорта, мне все равно нужно будет импортировать popen PIPE и т. д.? – jonathan topf 12 December 2011 в 17:26
  • 2
    Нет, вы этого не делаете, но тогда вам нужно ссылаться на них как subprocess.PIPE. Этот метод также импортирует все в модуль подпроцесса. from subprocess import PIPE вводит в текущее пространство имен, так что вы можете использовать только PIPE. – jro 12 December 2011 в 17:54
  • 3
    единственная проблема, связанная с этим методом, заключается в том, что программа зависает, пока процесс думает, я бы хотел, чтобы скрипт python мог запустить процесс и контролировать его stdout издалека – jonathan topf 13 December 2011 в 06:49
  • 4
    Метод communicate считывает данные до тех пор, пока не будет получен EOF. Если вы хотите динамически взаимодействовать с процессом, обратитесь к каналу, используя p.stdin.write('data'). Для чтения см. Мой предыдущий комментарий. Предупреждение об этом способе общения, так что будьте осторожны, вы не заполняете буферы. Самый простой способ проверить это - просто попробовать ... – jro 13 December 2011 в 11:04
  • 5
    Для python 3.4 вам нужно сделать p.communicate(input="data for input".encode()) – qed 9 November 2014 в 03:16
  • 6
    – UpmostScarab 21 May 2017 в 08:09

Вы можете предоставить файл-подобный объект аргументу stdin в subprocess.call().

Документация для объекта Popen применяется здесь.

Чтобы захватить вывод, вместо этого вы должны использовать subprocess.check_output(), который принимает аналогичные аргументы. Из документации:

>>> subprocess.check_output(
...     "ls non_existent_file; exit 0",
...     stderr=subprocess.STDOUT,
...     shell=True)
'ls: non_existent_file: No such file or directory\n'
0
ответ дан user 18 August 2018 в 00:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: