我正在编写一个构建脚本,用于解决依赖的共享库(以及它们的共享库等)。这些共享库不存在于正常的
为了使构建过程正常工作(让编译器找到这些库),已更改
构建过程如下:
加载器脚本(更改PATH)->基于Python的构建脚本->配置->构建->解决依赖关系->安装。
Python实例从其父Shell继承了更改后的
在Python内部,我试图获取默认的
想法:
解决“默认”
尝试的实现:
需要一个在*nix系统下一致的方法。
PATH
环境变量中。为了使构建过程正常工作(让编译器找到这些库),已更改
PATH
以包括这些库的目录。构建过程如下:
加载器脚本(更改PATH)->基于Python的构建脚本->配置->构建->解决依赖关系->安装。
Python实例从其父Shell继承了更改后的
PATH
变量。在Python内部,我试图获取默认的
PATH
(而不是从其父Shell继承的PATH
)。想法:
解决“默认”
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,但构建脚本应该跨平台。
编辑:
跨平台的限制似乎太严格了。现在可以考虑相同概念的不同实现。
例如,使用此答案中的代码,可以使用 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系统下一致的方法。
PATH
变量,因为还有其他非Python工具需要修改PATH
。因此,PATH
的更改必须在加载脚本中进行。 - dilbert.bat
文件,必须保持不变。我已经编辑了问题。你知道一种方法可以“信号”操作系统启动一个不是 Python 子进程的新进程吗? - dilbert