В чем разница между каналами и модулем подпроцесса? - PullRequest
0 голосов
/ 17 мая 2019

Я запутался с конвейерами и модулем подпроцесса.

вот мой код:

import pipes
import subprocess


with open('123.txt', 'w') as f:
    f.write('a line 1\n')
    f.write('a line 2\n')

t = pipes.Template()
t.append('grep a', '--')
f = t.open('123.txt', 'r')
print(f.readlines())

with open('123.txt', 'r') as f:
    p = subprocess.Popen('grep a', stdin=f, stdout=subprocess.PIPE, shell=True, universal_newlines=True)

print(p.readlines())

их выходные данные точно такие же:

['a line 1\n', 'a line 2\n']
['a line 1\n', 'a line 2\n']

Myвопрос:

  1. В чем разница между этими двумя модулями.

  2. Могу ли я писать строки через подпроцесс.PIPE (stdin) и перенаправлять надругой подпроцесс. ТРУБА (stdout).В этой ситуации, что args я должен использовать в subprocess.Popen

1 Ответ

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

Палка с subprocess. pipes * специфичен для * NIX, почти не поддерживается и построен на полуснеценных os.system / os.pipe примитивах, которые subprocess существует для замены. Хотя subprocess специально не упоминает модуль pipes, он предоставляет примеры для замены конвейеров оболочки , которые будут обрабатывать случаи, о которых вы, похоже, заботитесь, и без оболочек, неявно вовлеченных в pipes (поскольку он построен на os.system / os.popen), subprocess может быть безопаснее и быстрее (если вы не используете shell=True, то есть) и более переносим для загрузки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...