【发布时间】:2014-05-19 00:35:35
【问题描述】:
我正在编写一个构建脚本来解析依赖的共享库(及其共享库等)。这些共享库不存在于普通的PATH 环境变量中。
为了使构建过程正常工作(以便编译器找到这些库),PATH 已更改为包含这些库的目录。
构建过程如下:
加载器脚本(更改 PATH)-> 基于 Python 的构建脚本 -> 配置 -> 构建 -> 解决依赖关系 -> 安装。
Python 实例从其父 shell 继承更改后的 PATH 变量。
在 Python 中,我试图获取默认的 PATH(不是从其父 shell 继承的那个)。
想法:
解决“默认”PATH 变量的想法是以某种方式“通知”操作系统启动一个新进程(运行打印 PATH 的脚本),但该进程不是当前 Python 进程(并且可能不会继承其修改后的环境变量)。
尝试的实现:
import os
import sys
print os.environ["PATH"]
print "---"
os.spawnl(os.P_WAIT, sys.executable, "python", "-c \"import os;print(os.environ['PATH']);\"")
os.spawn 似乎使用与调用它的 Python 进程相同的环境变量。我也用subprocess.POpen 尝试过这种方法,但没有成功。
这种方法可以实施吗?如果不是,还有什么替代方法(假设加载程序脚本和整个过程不能改变)?
我目前使用的是 Windows,但构建脚本是跨平台的。
编辑:
跨平台约束似乎过于严格。现在可以考虑相同概念的不同实现。
例如,使用来自this 答案的代码,Windows 注册表可用于获取“默认”系统PATH 变量。
try:
import _winreg as winreg
except ImportError:
try:
import winreg
except ImportError:
winreg = None
def env_keys(user=True):
if user:
root = winreg.HKEY_CURRENT_USER
subkey = "Environment"
else:
root = winreg.HKEY_LOCAL_MACHINE
subkey = r"SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
return root, subkey
def get_env(name, user=True):
root, subkey = env_keys(user)
key = winreg.OpenKey(root, subkey, 0, winreg.KEY_READ)
try:
value, _ = winreg.QueryValueEx(key, name)
except WindowsError:
return ""
value = winreg.ExpandEnvironmentStrings(value)
return value
print get_env("PATH", False)
*nix 需要一种一致的方法。
【问题讨论】:
标签: python environment-variables