在 Pyenv 项目中,我们遇到了一个特殊的问题。
我们正在用我们的 Bash 脚本(“shims”)替换python
(和python*
),这些脚本选择要在运行时运行的 Python 可执行文件。
现在,有些用户希望使用一个特殊的选择逻辑,当一个Python脚本运行的path/to/script.py
。问题是,如果脚本作为<python> path/to/script.py
!
有没有办法可靠地区分这两种情况?
我找不到任何东西:根据第二种情况下命令行参数的制定方式,在两种情况下都可以执行完全相同的命令行:(
给出的 Bash 脚本不是真正的 shim,只是一个演示示例展示我们的逻辑所见和所做)
$ cat python3
#!/bin/bash
echo "'$0'"
for a in "$@"; do
echo "'$a'"
done
# need to do the detection here
exec python3 "$@"
$ cat t.py
#!/home/vmuser/python3
import sys
print(sys.argv)
$ $PWD/t.py
'/home/vmuser/python3'
'/home/vmuser/t.py'
['/home/vmuser/t.py']
$ $PWD/python3 $PWD/t.py
'/home/vmuser/python3'
'/home/vmuser/t.py'
['/home/vmuser/t.py']
Run Code Online (Sandbox Code Playgroud)
由于shebang是Linux内核的一个特性——也许它设置了一些表明这种机制已被使用的指标?
我们曾考虑要求用户在他们希望应用特殊逻辑的 Python 脚本中使用特殊的 shebang,但这个想法被证明不受欢迎,因为它使这些脚本无法移植。
小智 5
由于shebang是Linux内核的一个特性——也许它设置了一些表明这种机制已被使用的指标?
是的,它确实。Linux 将AT_EXECFN
辅助向量条目设置为原始可执行文件的路径。在 C 中,您可以使用char *at_execfn = (char*)getauxval(AT_EXECFN)
, 后跟stat(at_execfn)
, 等来完成。
但是,从 bash 获取它很棘手。您可以尝试打开包装/proc/self/auxv
,然后查看/proc/self/mem
. 祝你好运;-)