Python中,当使用os.environ['LD_LIBRARY_PATH']
或os.environ['PATH']
获取环境变量的值时,它会从父进程的环境(通常是bash)中复制这些值到一个字典中(即子进程的环境,也就是Python运行实例继承自bash进程的环境)。
你可以通过在bash中使用env
命令来查看此环境变量部分的输出。
你还可以通过在修改任何环境变量后引入一个无限循环(while 1: pass
)来从/proc/<pid>/environ
中查看/读取此环境数据。
如果在Python脚本中修改此变量的值并从/proc/<pid>/environ
中查看/读取,你会发现实际的变量数据并没有被修改,尽管Python脚本显示了修改后的字典键值。
实际上,当你在Python脚本内修改一个环境变量(如os.environ['LD_LIBRARY_PATH']='/<new_location>'
)时,它只是更新了本地字典中的值,而该字典并未映射到进程的环境变量区域。因此,它不会传播到当前进程的环境中,因为仅仅是修改了本地字典。
因此,如果想要反映新的环境变量值,我们应该使用execv
来覆盖进程的内存镜像,以使用新的环境变量数据。
示例:
new_lib = '/<new_location>'
if not new_lib in os.environ['LD_LIBRARY_PATH']:
os.environ['LD_LIBRARY_PATH'] += ':'+new_lib
try:
os.execv(sys.argv[0], sys.argv)
except Exception as e:
sys.exit('EXCEPTION: Failed to Execute under modified environment, '+e)
import xyz
限制:理想情况下,Python 不应该允许修改 os.environ
变量。
但是由于没有常量字典数据类型,它允许对数据变量进行修改。
修改这些值没有任何用处,因为除非使用 execv
,否则在运行过程的真实环境中不会反映任何有用信息。
.so
或.a
文件,而是使用.dll
和.lib
文件,我的库将不得不以某种方式重新编译以适应它。我只是觉得一个快速而简单的解决方案会方便测试和开发。 - iFreilicht