Linux shell源命令在python中等效

时间:2013-03-07 16:20:56

标签: 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" <just to verify the if if working>
    <what goes here to replace "source /etc/rc.platform"?>

我查看了subprocess和execfile但没有成功。

python脚本需要访问rc.platform

设置的环境变量

5 个答案:

答案 0 :(得分:3)

一个有点hackish的解决方案是解析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

答案 1 :(得分:1)

(以下是他的评论中描述的crayzeewulf解决方案的演示。)

如果/etc/rc.platform仅包含环境变量,您可以阅读它们并将它们设置为Python进程的env vars。

鉴于此文件:

$ 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'

答案 2 :(得分:1)

返回工作太多了。要保留一个小的shell脚本来获取我们需要的所有env变量,并忘记将它们读入python。

答案 3 :(得分:0)

试试这个:

if os.path.exists ("/etc/rc.platform"):
    os.system("/etc/rc.platform")

答案 4 :(得分:0)

由于source是内置的shell,因此您需要在调用shell=True时设置subprocess.call

>>> 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来调用新剧本。