Как мне передать строку в подпроцесс.Popen в Python 2?[дубликат]

StackOverflow https://stackoverflow.com/questions/1421311

  •  07-07-2019
  •  | 
  •  

Вопрос

На этот вопрос уже есть ответ здесь:

Я хотел бы запустить процесс из Python (2.4/2.5/2.6), используя Popen, и я хотел бы предоставить ему строку в качестве стандартного ввода.

Я напишу пример, в котором процесс выполняет ввод "head -n 1".

Следующее работает, но я хотел бы решить это более приятным способом, без использования echo:

>>> from subprocess import *
>>> p1 = Popen(["echo", "first line\nsecond line"], stdout=PIPE)
>>> Popen(["head", "-n", "1"], stdin=p1.stdout)
first line

Я пытался использовать StringIO, но это не работает:

>>> from StringIO import StringIO
>>> Popen(["head", "-n", "1"], stdin=StringIO("first line\nsecond line"))
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "/usr/lib/python2.4/subprocess.py", line 533, in __init__
    (p2cread, p2cwrite,
  File "/usr/lib/python2.4/subprocess.py", line 830, in _get_handles
    p2cread = stdin.fileno()
AttributeError: StringIO instance has no attribute 'fileno'

Я думаю, я мог бы создать временный файл и записать туда строку - но это тоже не очень приятно.

Это было полезно?

Решение

Вы пробовали скормить свою веревочку общаться в виде строки?

Popen.communicate(input=my_input)

Это работает следующим образом:

p = subprocess.Popen(["head", "-n", "1"], stdin=subprocess.PIPE)
p.communicate('first\nsecond')

выходной сигнал:

first

Я забыл установить stdin в subprocess.PIPE, когда я попробовал это сначала.

Другие советы

Использование ос.труба:

>>> from subprocess import Popen
>>> import os, sys
>>> read, write = os.pipe()
>>> p = Popen(["head", "-n", "1"], stdin=read, stdout=sys.stdout)
>>> byteswritten = os.write(write, "foo bar\n")
foo bar
>>>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top