如何使用`env python3`并保留调用环境?
How to use `env python3` and retaining the calling environment?
我在 OSX 上有一个问题,即 #!/usr/bin/env python3
导致环境变量,例如库路径(例如 LD_LIBRARY_PATH)丢失。在 Linux 它工作正常。
阅读 env
上的手册页,它似乎不应该这样做。它应该只在我请求时才修改环境,但我没有。
什么是保护环境的便携式 shebang 线?
注意:我正在检测问题,因为在我的一个程序上调用 subprocess.open
失败,因为它找不到库之一。然而,如果我以交互方式启动 python,则相同的调用工作正常。
这是工作中的OS X System Integrity Protection;某些 'dangerous' 环境变量,例如 DYLD_LIBRARY_PATH
,并且正如您所发现的,LD_LIBRARY_PATH
不会传递给具有 /usr/bin
或 /bin
路径的任何二进制文件。
因此,/usr/bin/env
永远不会看到任何几个环境变量,也无法将它们传递给它生成的 python3
子进程。
查看有关该主题的其他几篇帖子:
- https://apple.stackexchange.com/questions/212945/unable-to-set-dyld-fallback-library-path-in-shell-on-osx-10-11-1
- https://apple.stackexchange.com/questions/215030/el-capitan-make-check-dyld-library-path
如果您使用 subprocess
,我会检查 shebang 行,提取以 env
命名的二进制文件,在您的命令前加上该二进制文件,然后完全绕过 env
.
我在 OSX 上有一个问题,即 #!/usr/bin/env python3
导致环境变量,例如库路径(例如 LD_LIBRARY_PATH)丢失。在 Linux 它工作正常。
阅读 env
上的手册页,它似乎不应该这样做。它应该只在我请求时才修改环境,但我没有。
什么是保护环境的便携式 shebang 线?
注意:我正在检测问题,因为在我的一个程序上调用 subprocess.open
失败,因为它找不到库之一。然而,如果我以交互方式启动 python,则相同的调用工作正常。
这是工作中的OS X System Integrity Protection;某些 'dangerous' 环境变量,例如 DYLD_LIBRARY_PATH
,并且正如您所发现的,LD_LIBRARY_PATH
不会传递给具有 /usr/bin
或 /bin
路径的任何二进制文件。
因此,/usr/bin/env
永远不会看到任何几个环境变量,也无法将它们传递给它生成的 python3
子进程。
查看有关该主题的其他几篇帖子:
- https://apple.stackexchange.com/questions/212945/unable-to-set-dyld-fallback-library-path-in-shell-on-osx-10-11-1
- https://apple.stackexchange.com/questions/215030/el-capitan-make-check-dyld-library-path
如果您使用 subprocess
,我会检查 shebang 行,提取以 env
命名的二进制文件,在您的命令前加上该二进制文件,然后完全绕过 env
.