Подпроцесс: вызов программы с двумя перенаправлениями ввода

#python #bash #subprocess #io-redirection

#питон #удар #подпроцесс #ввод-перенаправление #bash #io-перенаправление

Вопрос:

Я пытаюсь выполнить следующую команду, где AAA и BBB являются переменными Python, которые содержат кучу многострочных данных.

Я бы предпочел не замедлять работу, записывая переменные на диск. Похоже, subprocess.Popen это должно как-то поддерживаться.

 diff <(echo AAA) <(echo BBB)
  

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

Как мне вызвать один исполняемый файл оболочки на Python, используя подпроцесс, с двумя перенаправлениями ввода, которые содержат переменные Python?

Комментарии:

1. Popen() возвращаемое значение имеет stdin атрибут (при условии, что вы передали его stdin=PIPE при создании объекта). Вызовите .write() это дважды, передав ему свои значения AAA и BBB .

2. Вы пытаетесь вызвать diff из Python? Или вы пытаетесь передать выходные данные двух скриптов Python в diff оболочку? Я не совсем понимаю, что вы пытаетесь сделать.

3. <(echo AAA) это замена процесса, а не перенаправление. Bash выполняется echo AAA асинхронно и перенаправляет свой стандартный вывод в FIFO, затем заменяет <(echo AAA) путь к FIFO. Запустите set -x; diff <(echo AAA) <(echo BBB) , и вы увидите, что фактически выполняемая команда выглядит примерно так diff /dev/fd/63 /dev/fd/62 .

4. Я думаю, вы можете сделать то же самое в Python, используя FIFOs.

5. Если вы хотите получить diff с помощью Python, вы пробовали использовать difflib ?

Ответ №1:

Достигается ли это то, что вы хотели?

 import os
import subprocess

os.environ['aaa'] = """This is python multiline data containing
AAA"""
os.environ['bbb'] = """This is python multiline data containing
BBB"""
process = subprocess.Popen(['/bin/bash', '-c', 'diff <(echo "$aaa") <(echo "$bbb")'])
process.communicate()
  

Комментарии:

1. В итоге я использовал difflib, думаю, это тоже сработало бы.