#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, думаю, это тоже сработало бы.