dil*_*ert 4 python environment-variables
我正在编写一个构建脚本来解析依赖的共享库(及其共享库等)。这些共享库不存在于正常的PATH环境变量中。
为了使构建过程正常工作(让编译器找到这些库),PATH已更改为包含这些库的目录。
构建过程是这样的:
加载器脚本(更改 PATH)-> 基于 Python 的构建脚本 -> 配置 -> 构建 -> 解决依赖关系 -> 安装。
Python 实例PATH从其父 shell 继承更改的变量。
在 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']);\"")
Run Code Online (Sandbox Code Playgroud)
os.spawn似乎使用与调用它的 Python 进程相同的环境变量。我也尝试过这种方法subprocess.POpen,但没有成功。
这个办法可以实施吗?如果没有,替代方法是什么(假设加载器脚本和整个过程不能改变)?
我目前使用的是 Windows,但构建脚本是跨平台的。
编辑:
跨平台的限制似乎过于严格。现在可以考虑同一概念的不同实现。
例如,使用此答案中的代码,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)
Run Code Online (Sandbox Code Playgroud)
*nix 需要一个一致的方法。
使用subprocess.Popen,您可以为子进程提供使用的环境:
default_path = os.environ[\'PATH\'] # save the default path before changing it\nos.environ[\'PATH\'] = # whatever you want\nchild_env = os.environ.copy()\nchild_env[\'PATH\'] = default_path\n# change env\nsubprocess.Popen(..., env=child_env)\nRun Code Online (Sandbox Code Playgroud)\n\n文档指出将使用提供的环境而不是从父级继承它:
\n\n\n\n如果 env 不是 None,则它必须是定义新进程的环境变量的映射;使用它们而不是继承当前进程 xe2x80x99 环境,这是默认行为。
\n