Есть ли способ сохранить / перенести среду bash между вызовами подпроцесса в python? - PullRequest
0 голосов
/ 01 ноября 2018

Проблема: предположим, у меня есть сценарии A, B и C1, C2, ... CN.

Script B sources скрипт A, который содержит несколько переменных и функций среды, а затем вызывает C скрипты, которые на них полагаются.

Теперь, допустим, я хочу заменить скрипт bash B на программу на python. Как мне лучше всего это сделать, если я хочу "установить" A ровно один раз (не перед каждым C вызовом)?

Я хочу иметь возможность "обрабатывать" каждый C по отдельности, то есть запускать некоторый код Python после выполнения каждого C, поэтому создание большой команды ". A && C1 && C2 ..." не сработает.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Если не включить в программу на Python интерпретатор bash (который нереалистичен; bash не предназначен для этого), то проще всего написать сценарий оболочки-оболочки, исходный код которого A, затем использует exec для запуска скрипта Python. После exec ваш скрипт Python сохраняет ту же среду, что и оболочка, включая все, что было найдено в A:

# wrapper script
source A
exec B.py

В B.py каждый из сценариев Ci будет наследовать переменные, определенные в A, из среды B.py.


Другой вариант - портировать A в модуль Python, который B.py может импортировать напрямую. Вы бы изменили

export x=foo
export y=1

в

import os
os.environ["x"] = "foo"
os.environ["y"] = "1"

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

0 голосов
/ 01 ноября 2018

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

import subprocess

def start_process(command=''):
    return subprocess.Popen(command.split(' '), stdout=subprocess.PIPE, shell=False, 
creationflags = 0x08000000)

with open('yourscript.sh','rt') as f:
    lines = f.read().split('\n')
    output=[str(start_process(line).communicate()[0]) for line in lines]

Таким образом, вы сможете создать структуру, в которой ваш скрипт на python координирует ваши скрипты bash, а не на равных, если это имеет смысл

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