python - 更改当前进程环境的 LD_LIBRARY_PATH

标签 python shared-libraries environment-variables

是否可以更改当前进程的环境变量?

更具体地说,在 python 脚本中,我想更改 LD_LIBRARY_PATH 以便在导入依赖于某些 xyz.soxyz 的模块“x”时.so 取 self 在 LD_LIBRARY_PATH 中的给定路径

还有其他方法可以动态更改加载库的路径吗?

编辑:我想我需要提到我已经尝试过类似的东西 os.environ["LD_LIBRARY_PATH"] = mypath os.putenv('LD_LIBRARY_PATH', mypath)

但是这些修改了环境。对于生成的子进程,而不是当前进程,并且模块加载不考虑新的 LD_LIBRARY_PATH

Edit2,所以问题是我们可以改变环境或其他东西,以便库加载器看到它并从那里加载吗?

最佳答案

原因

os.environ["LD_LIBRARY_PATH"] = ...

不起作用很简单:这个环境变量控制动态加载器的行为(Linux 上的ld-linux.so.2ld.so.1 Solaris),但加载程序仅在进程启动时查看一次 LD_LIBRARY_PATH。在当前进程之后更改 LD_LIBRARY_PATH 的值无效(正如 this 问题的答案所说)。

您确实有一些选择:

A.如果你知道你将需要 /some/path 中的 xyz.so,并从一开始就控制 python 脚本的执行,那么只需设置 LD_LIBRARY_PATH 根据自己的喜好(在检查它是否尚未设置后),然后重新执行自己。这就是 Java 所做的。

B.您可以通过其绝对路径导入x.so之前导入/some/path/xyz.so。当你再导入 x.so 时,加载器会发现它已经加载了 xyz.so,并且会使用已经加载的模块而不是再次搜索它。

C.如果你自己构建x.so,你可以在其链接行添加-Wl,-rpath=/some/path,然后导入x.so 将导致加载器在 /some/path 中查找依赖模块。

关于python - 更改当前进程环境的 LD_LIBRARY_PATH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1178094/

相关文章:

objective-c - 如何解决 undefined symbol 错误?

linux - 为什么不建议将共享库保留在可执行位置

web-services - Heroku 的其他环境变量是什么?

c++ - 如何使用 dlopen 检查共享库是否加载成功或未加载?

python - 用极坐标中的一个行框架划分数据帧行

python - 如何在方法 sort() 中查找比较计数

python用正则表达式匹配电子邮件ID

node.js - 使用服务帐户将 Firebase 应用程序部署到 Heroku(使用 dotenv 的环境变量)

tags - 如何使用操作系统环境变量配置 glassfish domain.xml?

python - 如何从 s3 存储桶获取 excel 文件并将文件再次上传到 s3 存储桶而不使用 pandas - Python