看 pip 的启动脚本看得我人都傻了,还能把 shell 和 py 揉到一起写

2022-07-26 16:58:24 +08:00
 MiketsuSmasher

/usr/bin/pip3.10

#!/bin/sh
"exec" "$(dirname $0)/python3.10" "$0" "$@"
# -*- coding: utf-8 -*-
import re
import sys
from pip._internal.cli.main import main
if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(main())

个人理解是,上述脚本通过 exec ,用指定位置的 python 直接替换掉了当前的 shell 进程,那么为什么 "exec" "$(dirname $0)/python3.10" "$0" "$@" 之后的代码还能接着执行呢?

以及,为什么要这样写呢,拆开写不好吗?

5413 次点击
所在节点    Linux
26 条回复
lovelylain
2022-07-26 23:36:22 +08:00
这种写法应该是改进版,可以随意放置 python 目录,方便打包发布。我记得几年以前我用 pyvenv 生成的执行环境,第一行是写死的 python 完整路径,这就导致打包到其他机器必须保持路径完全一样,局限性很大,改成这种跟 shell 结合的写法,就不受这个限制了。妙!
xujinkai
2022-07-26 23:41:30 +08:00
想起来有个同事把升级包数据拼接在一个 shell 脚本后边,做成了一个自执行的升级程序
MiketsuSmasher
2022-07-26 23:42:49 +08:00
@Nitroethane 这个你真说错了,我给的代码就是来自 Arch 的 python-pip 包的 /usr/bin/pip
MiketsuSmasher
2022-07-26 23:45:13 +08:00
@Nitroethane 不好意思,刚刚看错了,Arch 的 pip 确实是纯 py
MiketsuSmasher
2022-07-26 23:46:20 +08:00
rev1si0n
2022-07-27 10:34:56 +08:00
骚操作,学到了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/868827

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX