与python中的Linux shell源代码命令等效
将shell脚本转换为python并尝试找到执行以下操作的最佳方法。我需要它,因为它包含我需要读取的环境变量与python中的Linux shell源代码命令等效,python,shell,Python,Shell,将shell脚本转换为python并尝试找到执行以下操作的最佳方法。我需要它,因为它包含我需要读取的环境变量 if [ -e "/etc/rc.platform" ]; then . "/etc/rc.platform" fi 我已转换了“if”,但不确定如何处理此问题。“/etc/rc.platform”作为源代码是一个shell命令。到目前为止,我有以下几点 if os.path.isfile("/etc/rc.platform"): print "exists" <
if [ -e "/etc/rc.platform" ];
then
. "/etc/rc.platform"
fi
我已转换了“if”,但不确定如何处理此问题。“/etc/rc.platform”作为源代码是一个shell命令。到目前为止,我有以下几点
if os.path.isfile("/etc/rc.platform"):
print "exists" <just to verify the if if working>
<what goes here to replace "source /etc/rc.platform"?>
如果os.path.isfile(“/etc/rc.platform”):
打印“存在”
我已经查看了subprocess和execfile,但没有成功
python脚本需要访问rc.platform设置的环境变量,请尝试以下操作:
if os.path.exists ("/etc/rc.platform"):
os.system("/etc/rc.platform")
由于
source
是shell内置的,因此在调用子流程调用时需要设置shell=True
>>> import os
>>> import subprocess
>>> if os.path.isfile("/etc/rc.platform"):
... subprocess.call("source /etc/rc.platform", shell=True)
我不确定您在这里想做什么,但我仍然想提及:/etc/rc.platform
可能会导出一些shell函数,供rc.d
中的其他脚本使用。由于这些是shell函数,它们将仅导出到由subprocess.call()
调用的shell实例,如果您调用另一个subprocess.call()
,这些函数将不可用,因为您正在生成一个新的shell来调用新脚本。(以下是crayzeewulf在其评论中描述的解决方案的演示。)
如果/etc/rc.platform
仅包含环境变量,则可以读取它们并将它们设置为Python进程的环境变量
给定此文件:
$ cat /etc/rc.platform
FOO=bar
BAZ=123
读取和设置环境变量:
>>> import os
>>> with open('/etc/rc.platform') as f:
... for line in f:
... k, v = line.split('=')
... os.environ[k] = v.strip()
...
>>> os.environ['FOO']
'bar'
>>> os.environ['BAZ']
'123'
一个有点粗俗的解决方案是解析env
输出:
newenv = {}
for line in os.popen('. /etc/rc.platform >&/dev/null; env'):
try:
k,v = line.strip().split('=',1)
except:
continue # bad line format, skip it
newenv[k] = v
os.environ.update(newenv)
编辑:修复了拆分参数,这要感谢@l4mpi为返回做了太多的工作。将保留一个小的shell脚本来获取我们需要的所有环境变量,而忘记将它们读入python。您必须解析/etc/rc.platform
,提取环境变量名称和值,并相应地更新。@Crazyewulf-这不是ju关于环境变量,脚本还可以导出bash函数。除非您试图对所有调用的脚本重用同一个shell,否则您打算如何从python脚本中使用它们。我建议也将/etc/rc.platform
移植到python,因为
与import
。如果您试图用python重新编写脚本,那么很可能需要用python重写/etc/rc.platform。如果它只是进行变量赋值,您可以将其设置为一个配置文件。在一般情况下,您尝试做的是困难的。@Tuxdude您对于一般情况是正确的。但是q中提到的OP“我需要它,因为它包含我需要读取的环境变量。”因此,我认为OP可能只关心此文件中的环境变量。如果在子shell中运行脚本,则不会有任何帮助,因为所有环境变量设置都将被丢弃。@grep-我知道这一点,而且它不仅涉及环境变量,甚至还涉及由/等导出的bash函数/python脚本将无法使用rc/platform
,并且任何新的shell开始从say/etc/rc.d
调用其他相关脚本。这与OP引用的shell脚本的效果不同。os.system
在子shell中运行命令,因此,父进程将不会看到添加的任何环境变量d/modified by/etc/rc.platform
。您无法在python进程中生成sh或bash脚本,因为python进程不知道如何解释bash语言。因此,您需要一个子shell来运行bash并解释脚本。由于它是在子shell中完成的,因此python进程将无法获取新的env值。如果变量引用,则此操作将不起作用在声明中添加其他变量,例如X=“$Y/foo”
。此外,脚本还可以使用其他shell命令(如awk、grep等)或者内置shell变量,这显然不会被计算。好的方面。我想这里的共识是,除了我用作示例的最简单的情况外,没有简单的方法可以实现这一点。我曾经需要类似的东西,结果生成了一个子shell,获取脚本,然后解析env
的输出。。。也许晚饭后我会写一个答案。