Как использовать подпроцесс Python для записи строки в файл - PullRequest
1 голос
/ 17 мая 2019

Я пытаюсь выяснить, что происходит в subprocess. Итак, я пишу этот код:

import subprocess

p1 = subprocess.Popen('grep a', stdin=subprocess.PIPE, stdout=subprocess.PIPE,shell=True, universal_newlines=True)
p2 = subprocess.Popen('grep a', stdin=p1.stdout, stdout=open('test', 'w'),shell=True, universal_newlines=True)

p1.stdin.write("asdads"*700)

После того, как я записал строку в p1.stdin, я ожидал, что строка будет записана в файл test. Но в этом файле ничего нет.

Когда я попробовал другой способ:

out, err = p1.communicate("adsad"*700)

Строка в out.

1 Ответ

2 голосов
/ 17 мая 2019

Ваш код не работал, потому что ваш поток stdin не закрыт. Чтобы доказать, что я говорю:

p1 = subprocess.Popen('grep l', stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True, universal_newlines=True)
out, err = p1.communicate('hello')

>>> out
'hello\n'

Теперь протестируйте с communicate, который автоматически закроет вам поток.

p1 = subprocess.Popen('grep l', stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True, universal_newlines=True)
p2 = subprocess.Popen('grep h', stdin=p1.stdout, stdout=open('test', 'w'),shell=True, universal_newlines=True)

# test is already created and empty
# but call communicate again can write to file
>>> p1.communicate('hello')
('', None)

$cat test
hello

И еще один способ:

# use stdin.write
>>> p1.stdin.write('hello') # empty file
>>> p1.stdin.close() # flushed

Ссылки:

  1. Подпроцесс popen.communicate () против stdin.write () и stdout.read ()
  2. https://docs.python.org/3/library/subprocess.html#subprocess.Popen.communicate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...