使用“默认”环境变量启动新的子进程

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 需要一个一致的方法。

dan*_*ano 5

使用subprocess.Popen,您可以为子进程提供使用的环境:

\n\n
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)\n
Run Code Online (Sandbox Code Playgroud)\n\n

文档指出将使用提供的环境而不是从父级继承它

\n\n
\n

如果 env 不是 None,则它必须是定义新进程的环境变量的映射;使用它们而不是继承当前进程 xe2x80x99 环境,这是默认行为。

\n
\n