为何pip install在部分设备上会修改Python脚本的解释器行?
关于pip安装后shebang行被修改的原因及解决办法
这个现象其实是setuptools(pip背后负责打包安装的工具)的自动shebang重写特性导致的,不同系统环境下行为不一样,咱们一步步拆解:
为什么会出现差异?
- 当pip安装包含可执行脚本的包时,setuptools会自动检测当前环境中pip关联的Python解释器路径,然后替换脚本首行的shebang。这么做的目的是保证脚本能直接调用到安装时用的那个Python解释器,避免因为
#!/usr/bin/env python指向的解释器和实际安装环境不一致导致运行错误。 - 你的Ubuntu 16.04系统里,默认的pip可能绑定到了系统自带的
/usr/bin/python(也就是Python 2.7),所以安装时就把shebang改成了这个路径;而你朋友的OSX环境中,pip可能关联的是通过Homebrew等方式安装的Python,或者OSX的setuptools配置没有触发这个重写逻辑,所以保留了原有的#!/usr/bin/env python。
怎么强制pip不修改shebang?
最可靠的方式是在你的包打包配置里直接指定固定的shebang,让setuptools不要自动替换:
1. 修改setup.py(传统打包方式)
在setup()函数中添加options配置,指定脚本的可执行路径:
from setuptools import setup setup( name="colorize.py", version="0.9.1", # 你的其他包配置(比如packages、entry_points等) options={ "build_scripts": { "executable": "#!/usr/bin/env python" } } )
2. 修改pyproject.toml(现代打包方式,推荐)
如果你的包用了PEP 621标准的pyproject.toml,直接在配置里添加:
[tool.setuptools] build-scripts.executable = "#!/usr/bin/env python"
3. 打包时临时指定(单次生效)
如果你只是临时打包测试,可以在生成源码包时加上--executable参数:
python setup.py sdist --executable="#!/usr/bin/env python"
额外提醒
考虑到Ubuntu 16.04默认的python是Python 2.7,如果你的包是针对Python 3开发的,建议把shebang改成#!/usr/bin/env python3,这样能避免用户在运行时调用到错误的Python版本。
内容的提问来源于stack exchange,提问作者merlin2011
相关产品推荐
相关产品推荐

