我知道在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:
,并且尾随冒号可能会通过将当前目录添加到搜索路径而导致问题。