python中的变量扩展能否像变量的shell扩展那样工作
我有一个遗留的python代码,它从shell脚本中读取变量值,如属性文件中的值。例如,假设我有一个shell程序x.sh用于变量声明,如下所示:python中的变量扩展能否像变量的shell扩展那样工作,python,shell,split,variable-expansion,Python,Shell,Split,Variable Expansion,我有一个遗留的python代码,它从shell脚本中读取变量值,如属性文件中的值。例如,假设我有一个shell程序x.sh用于变量声明,如下所示: Y_HOME=/utils Y_SPCL=$Y_HOME/spcl UTIL1=$Y_SPCL/u1 Y_LIB=$Y_HOME/lib 现在,在python程序abc.py中,我逐行读取x.sh文件,并使用line.split=[1]获取变量的值,例如,UTIL1以$Y_SPCL/u1的形式存在,而不是以/utils/SPCL/u1的形式存在。
Y_HOME=/utils
Y_SPCL=$Y_HOME/spcl
UTIL1=$Y_SPCL/u1
Y_LIB=$Y_HOME/lib
现在,在python程序abc.py中,我逐行读取x.sh文件,并使用line.split=[1]获取变量的值,例如,UTIL1以$Y_SPCL/u1的形式存在,而不是以/utils/SPCL/u1的形式存在。
我可以在python中使用一种机制来进行可变的扩展,就像在shell程序执行中一样。我认为,由于我使用x.sh不是作为一个shell程序,而是作为一个类似属性的配置文件,因此应该有扩展形式的所有变量,以使python程序正常运行,例如:
Y_HOME=/utils
Y_SPCL=/utils/spcl
UTIL1=/utils/spcl/u1
Y_LIB=/utils/lib
这不会对代码的遗留python部分进行更改,也不会将配置文件更改为外部属性数据。
请传递您的意见。有一个包dotenv可以做到这一点
pip安装-用户python dotenv
然后,在Python中:
导入dotenv,操作系统
dotenv.load_envx.sh
printos.environ[Y_LIB]
重要提示:确保变量替换读起来像${VAR}。因此,您的x.sh将如下所示:
Y_HOME=/utils
Y_SPCL=${Y_HOME}/spcl
UTIL1=${Y_SPCL}/u1
Y_LIB=${Y_HOME}/lib
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])
有一个包dotenv可以做到这一点
pip安装-用户python dotenv
然后,在Python中:
导入dotenv,操作系统
dotenv.load_envx.sh
printos.environ[Y_LIB]
重要提示:确保变量替换读起来像${VAR}。因此,您的x.sh将如下所示:
Y_HOME=/utils
Y_SPCL=${Y_HOME}/spcl
UTIL1=${Y_SPCL}/u1
Y_LIB=${Y_HOME}/lib
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=$Y_HOME/spcl
UTIL1=$Y_SPCL/u1
Y_LIB=$Y_HOME/lib
因此,对于每个变量,您将在下一个变量值中搜索它,并将其替换为正确的值。你可以有这样一个.py:
Y_HOME=/utils
Y_SPCL=${Y_HOME}/spcl
UTIL1=${Y_SPCL}/u1
Y_LIB=${Y_HOME}/lib
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=$Y_HOME/spcl
UTIL1=$Y_SPCL/u1
Y_LIB=$Y_HOME/lib
因此,对于每个变量,您将在下一个变量值中搜索它,并将其替换为正确的值。你可以有这样一个.py:
Y_HOME=/utils
Y_SPCL=${Y_HOME}/spcl
UTIL1=${Y_SPCL}/u1
Y_LIB=${Y_HOME}/lib
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])
输出:
为什么在代码中实现这一点比将配置文件更改为第二个示例更容易?您可以让一个shell解释该文件,然后查询其结果变量这就是为什么您自己用手工编写的代码而不是使用模块configparser来解析配置文件的原因吗?无论您是否这样做,您都可以使用os.path.expandvars来执行您想要的操作。为什么在代码中实现这一点比将配置文件更改为第二个示例更容易?您可以让shell解释该文件,然后查询结果变量是否有一个很好的理由说明为什么您自己用手工编写的代码而不是使用模块configparser来解析配置文件?不管您是否这样做,您都可以使用os.path.expandvars来做您想要做的事情。