Python中Linux shell source命令的等效实现

1 投票
5 回答
7618 浏览
提问于 2025-04-17 18:17

我正在把一个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 个回答

1

(这里展示了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'
3

一个有点不太正规的解决办法是解析一下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的帮助

0

为了得到结果,工作量太大了。我决定保留一个简单的脚本,用来获取我们需要的所有环境变量,干脆不把它们读入Python里了。

撰写回答