Как выполнить конвейер в Bash с помощью оболочки Python? - PullRequest
0 голосов
/ 25 июня 2019

Сценарий:

У меня есть конвейер в bash-скрипте и список некоторых процессов вместе с их аргументами. Я хочу запустить скрипт Python после выполнения каждого процесса (исполняемого) в конвейере, если процесс находится в моем списке. (Я использую Python 2.7)

Мое предлагаемое решение:

Использование сценария оболочки Python. Я заменил весь исполняемый файл в конвейере своим собственным скриптом Python, который:

1) проверяет процесс, если находится в списке, тогда FLAG = True

2) выполнить процесс с помощью исходного исполняемого файла, используя subprocess.Popen(process.command, shell=True).communicate()

3) если FLAG == True, то сделать что-то.

Проблема:

Использование текущего решения при запуске процесса с использованием subprocess.Popen().communicate(), процессы будут выполняться отдельно и они не могут получить выходные данные внутреннего процесса (дочерний процесс) во внешний процесс (родитель).

Например:

#!/bin/bash

Mean=`P1  $Image1 -M`
P2 "$Image2"  $Mean -F

Мы не вывели значение Mean во второй строке исполнения. Вторая строка будет выглядеть так:

subprocess.Popen("P2 $Image2  \nP1  $Image1 -M -F" , shell=True).communicate() 

Следовательно, он возвращает ошибку!

Есть ли в python лучший способ выполнить такой процесс?

Пожалуйста, дайте мне знать, есть ли другие предложения для этого сценария (я очень новичок в bash).

1 Ответ

0 голосов
/ 25 июня 2019

Нет необходимости использовать bash.

Предположим, современный Python 3.x:

#!/usr/bin/env python
import subprocess

image1 = sys.argv[1]
image2 = sys.argv[2]

p1 = subprocess.run(['P1', image1, '-M'], check=True, capture_output=True)
p2 = subprocess.run(['P2', image2, p1.stdout.strip(), '-F'], check=True, capture_output=True)
print(p2_result.stdout)

Смотрите здесь, что мы ссылаемся на p1.stdout.strip(), где нам нужно среднее значение в аргументах p2.

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