如何在python中为linux设置复杂的环境变量?



我知道在stackoverflow上有类似的问题,但我找不到类似的东西。

每当我运行 python 代码时,我都会尝试为 openCV 自动设置环境变量。

以下是在 Linux 中临时设置它们的代码:

export PATH=/usr/local/cuda-9.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

在 linux 中,当我回显 PATH 变量时,我得到以下输出:

/usr/local/cuda-9.0/bin:/home/phil/.nvm/versions/node/v10.9.0/bin:/home/phil/bin:/home/phil/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

我在python中使用以下代码:

os.environ['PATH'] = "/usr/local/cuda-9.0/bin${PATH:+:${PATH}}"
os.environ['LD_LIBRARY_PATH'] = "/usr/local/cuda-9.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}"

但是当我在python中回显PATH时,我得到了完全相同的PATH字符串。 我能做些什么来让python像linux一样理解${PATH:+:${PATH}}?

bashexport立即评估结果,如下所示:

giannis@local:~ > export TEST_VAR=$PATH
giannis@local:~ > echo $TEST_VAR
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

而记住,在 Python 中,os.environ的原生行为与此不同。 Python 中的os.environ实际上表现得像字典。所以当你尝试这个

os.environ['PATH'] = "/usr/local/cuda-9.0/bin${PATH:+:${PATH}}"

它不会像在原生 bash 中那样进行评估。如果你想在python中实现相同的行为,你应该这样做。

在 bash 中:

export SomeVariable="I am constructed in bash and the path is ${PATH}"

在 Python 中,你可以构建一个这样的变量

os.environ['some_key'] = "Like so: {something}".format(something=os.environ.get('SomeVariable', "")

所以在你的情况下,你可以用这样的事情实现同样的目的

os.environ['PATH'] = "/somthing/:{path}".format(path=os.environ['PATH']

${PATH:+:${PATH}}sh编程/脚本语言中使用的sh语法。Linux 不知道也不理解这种语法。

由于您使用的是 Python,因此您应该改用 Python 语法。

以下是此功能的 Bash 文档:

${parameter:+word}
Use Alternate Value.  If parameter is null or unset,
nothing is  substituted,  otherwise  the expansion of word
is substituted.

因此,直接转换为Python将是:

((":" + os.environ['PATH']) if os.environ['PATH'] else "")

没有什么神奇的事情发生,在这两种语言中,它只是简写:

if os.environ['PATH']:
# The path already had values, prepend ours with a colon:
os.environ['PATH'] = "/usr/local/cuda-9.0/bin" + ":" + os.environ['PATH']
else:
# The path was empty, just set it to our directory without a colon
os.environ['PATH'] = "/usr/local/cuda-9.0/bin"

这样做的目的是避免在尚未设置路径时出现尾随冒号。如果你只是这样做:

os.environ['PATH'] = "/usr/local/cuda-9.0/bin" + ":" + os.environ['PATH']

然后,路径可能最终只是/usr/local/cuda-9.0/bin:,并且尾随冒号可能会通过将当前目录添加到搜索路径而导致问题。

最新更新