Может ли расширение переменной в python работать как расширение переменной оболочки - PullRequest
1 голос
/ 25 марта 2020

У меня есть устаревший код python, который читает из сценария оболочки значения переменных, как в файле свойств. Например, скажем, у меня есть программа оболочки x. sh для объявления переменных как:

Y_HOME=/utils
Y_SPCL=$Y_HOME/spcl
UTIL1=$Y_SPCL/u1
Y_LIB=$Y_HOME/lib

Теперь из python программы ab c .py я читаю x. sh файл строка за строкой и используйте line.split ("=") [1], чтобы получить значение переменной, скажем, UTIL1 как $ Y_SPCL / u1 в нерасширенной форме, а не в развернутой форме как / utils / spcl / u1. Могу ли я иметь какой-то механизм в python, чтобы иметь жизнеспособное расширение, как при выполнении программы оболочки. Я думаю, поскольку я использую x. sh не как программу оболочки, а как файл конфигурации, такой как свойства, в расширенной форме должны быть все переменные, чтобы программа python работала правильно, например:

Y_HOME=/utils
Y_SPCL=/utils/spcl
UTIL1=/utils/spcl/u1
Y_LIB=/utils/lib

Это не изменит устаревшую часть кода python и не изменит файл конфигурации в качестве данных внешних свойств. Пожалуйста, передайте ваше мнение.

Ответы [ 2 ]

3 голосов
/ 25 марта 2020

Существует пакет dotenv, который может это сделать.

pip install --user python-dotenv

Затем в Python:

import dotenv, os
dotenv.load_env("x.sh")
print(os.environ["Y_LIB"])

Важно : убедитесь, что Ваши замены переменных читаются как ${VAR}. Итак, ваш x.sh будет выглядеть так:

Y_HOME=/utils
Y_SPCL=${Y_HOME}/spcl
UTIL1=${Y_SPCL}/u1
Y_LIB=${Y_HOME}/lib
1 голос
/ 25 марта 2020

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

Существует файл fileName, который содержит переменные:

Y_HOME=/utils
Y_SPCL=$Y_HOME/spcl
UTIL1=$Y_SPCL/u1
Y_LIB=$Y_HOME/lib

Итак, для каждой «переменной» вы ищите ее в следующих «значениях» переменных и заменяете ее на правильное «значение». Вы можете получить .py, например:

variables = []
with open("fileName", 'r') as f:
    while True:
        line = f.readline()[:-1] # Get the line minus '\n'
        if not line:
            break
        variables.append(line.split('=')) 

    for i in range(len(variables)):
        current =  "$" + variables[i][0]
        for j in range(len(variables)):
            replaced = None
            while replaced != variables[j][1]:
                # We replace until no further replaces happen
                replaced = variables[j][1].replace(current, variables[i][1])
                variables[j][1] = replaced

for var in variables:
    print(var[0] + "=" + var[1])

Вывод:

Y_HOME=/utils
Y_SPCL=/utils/spcl
UTIL1=/utils/spcl/u1
Y_LIB=/utils/li
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...