【问题标题】:How to use `env python3` and retaining the calling environment?如何使用`env python3`并保留调用环境?
【发布时间】:2017-06-14 06:54:38
【问题描述】:

我在 OSX 上遇到问题,#!/usr/bin/env python3 导致环境变量(例如库路径(例如 LD_LIBRARY_PATH))丢失。在 Linux 上它可以正常工作。

阅读env 上的手册页,它似乎不应该这样做。它应该只在我请求时修改环境,而我不是。

什么是保护环境的便携式shebang线?

注意:我正在检测问题,因为在我的一个程序上调用 subprocess.open 失败,因为它找不到其中一个库。但是,如果我以交互方式启动 python,则相同的调用可以正常工作。

【问题讨论】:

  • 没关系,似乎只有当前 shell 中的 某些 env vars 确实没有传播。我用一个通用的进行了测试,效果很好。
  • 这应该只发生在 --i 通过的情况下,通过简单阅读 env 的 MacOS 手册页。
  • @CharlesDuffy:LD_LIBRARY_PATH=foo env env | grep LD_LIBRARY_PATH 也重现了这个问题,而FOO=foo env env | grep FOO 可以正常工作。看起来像是一些特定的过滤。
  • 也相关:Unable to set DYLD_FALLBACK_LIBRARY_PATH in shell on OSX 10.11.1env 是一个 /usr/bin 二进制文件,因为某些环境变量被 系统完整性保护 剥离,所以受到“保护”。

标签: python macos shebang


【解决方案1】:

这是工作中的 OS X System Integrity Protection;某些“危险”环境变量,例如DYLD_LIBRARY_PATH,以及您发现的LD_LIBRARY_PATH,不会传递给任何带有/usr/bin/bin 路径的二进制文件。

因此,/usr/bin/env 永远不会看到多个环境变量中的任何一个,也无法将它们传递给它产生的 python3 子进程。

查看有关该主题的其他几篇文章:

如果你使用subprocess,我会检查shebang行,提取以env命名的二进制文件,在你的命令前加上那个二进制文件,然后完全绕过env

【讨论】:

  • 对于我对子进程的调用,我可以这样做,但我有其他脚本调用这些脚本(比如构建脚本),它们无法控制它们的调用方式。
  • 无论如何这真的很糟糕。 OSX 的这一“特性”使得设置开发环境变得非常困难。
  • 是的,这让事情变得更加困难;避免在需要访问这些变量的脚本上使用/usr/bin/env,这是我目前能做的最好的事情。
猜你喜欢
  • 2012-01-27
  • 2017-08-21
  • 1970-01-01
  • 2023-04-07
  • 2021-01-30
相关资源
最近更新 更多