【问题标题】:Why does `pip install` seem to change the interpreter line on some machines?为什么 `pip install` 似乎会更改某些机器上的解释器行?
【发布时间】:2018-05-28 01:12:11
【问题描述】:

我把我的colorize.py 包放到PyPi 上,发现了以下奇怪的行为。如果我从project page 下载colorize.py-0.9.1.tar.gz,并检查colorize.py 的第一行,我会得到以下输出:

$ wget https://files.pythonhosted.org/packages/91/d8/805853c14a8ccf67ddfe2cf41b634395ef69a1138a0dade303bf4b7c9b45/colorize.py-0.9.1.tar.gz
$ tar xvfz colorize.py-0.9.1.tar.gz
$ head -n1 colorize.py-0.9.1/colorize.py
#!/usr/bin/env python

但是,在我的Ubuntu 16.04.4 LTS 笔记本电脑上,如果我使用pip 安装,第一行已被替换:

$ pip install colorize.py
$ head -n1 $(which colorize.py)
#!/usr/bin/python

另一方面,我的朋友在她的 OS X 笔记本电脑上运行相同的安装命令,并获得了原始解释器行。

这是怎么回事,是否可以强制pip 在执行安装时不更改解释器行?

【问题讨论】:

  • setup.py 是否使用控制台入口点?如果是这样,则在安装时生成命令行脚本。
  • @JonathonReinhart,我不确定如何确定;我没有做任何具体的事情来让它使用控制台入口点,但我也不确定它是否是自动完成的。它只是从setuptools 调用setupgithub.com/hq6/Colorize/blob/master/setup.py

标签: python pip pypi


【解决方案1】:

这是故意这样做的:如果您安装了多个 Python,则将此文件作为可执行文件运行将始终调用为其安装的 Python,而不管您当前的PATH。请参阅 pytest running with another version of python 了解这会产生影响的情况 - 具体而言,防止破坏基于 Python 的系统脚本。

pip/_vendor/distlib/scripts.py:_make_script() 是完成这项工作的代码(查找“shebang”)。

绝对没有理由(因此没有提供方法)禁用此功能:运行与安装不同的脚本实际上可以保证会破坏它。如果你真的想要它,你可以随时运行<different python> <path_to_script.py>。正如 Python 的座右铭所说:“让正确的事情变得简单,让错误的事情变得困难”。

【讨论】:

  • 感谢您找到实际执行此操作的代码。 :)
  • @merlin2011 刚刚在pip 的目录中搜索了“shebang”,并找到了正确的结果。一些参考搜索后,得到了全貌。这次其实很简单)
猜你喜欢
  • 2023-04-09
  • 2014-01-17
  • 1970-01-01
  • 1970-01-01
  • 2018-11-22
  • 1970-01-01
  • 2011-05-29
  • 1970-01-01
  • 2013-05-28
相关资源
最近更新 更多