pip:为什么有时安装为 egg,有时安装为文件

pip: Why sometimes installed as egg, sometimes installed as files

在哪里可以强制 pip 安装为 "flat" 而不是 "egg".

对我来说这似乎是随机的。有时安装为 egg,有时安装为 flat。

pip help install 仅显示一个选项 --egg,它会强制安装 egg。但是我找不到 --flat 选项。

这些包来自一个自己的pypiserver,并且是这样上传的:

python setup.py sdist upload -r internal

安装期间 pip 的输出:

Best match: foo-client 2015.2
Downloading https://installserver:40443/pypi/packages/foo_client-2015.2.tar.gz
Processing foo_client-2015.2.tar.gz
Writing /home/bar_eins_daad/tmp/easy_install-z20B7b/foo_client-2015.2/setup.cfg
Running foo_client-2015.2/setup.py -q bdist_egg --dist-dir /home/bar_eins_daad/tmp/easy_install-z20B7b/foo_client-2015.2/egg-dist-tmp-GO1snX

我不知道这里为什么用bdist_egg。它会强制创建 egg 安装吗?

setup.py 确实使用 setuptools 而不是 distutils

我们的 pypiserver 上的包如下所示:

tar -tzf packages/foo_client-2015.3.tar.gz

内容:

foo_client-2015.2/
foo_client-2015.2/foo_client.egg-info/
foo_client-2015.2/foo_client.egg-info/SOURCES.txt
foo_client-2015.2/foo_client.egg-info/top_level.txt
foo_client-2015.2/foo_client.egg-info/dependency_links.txt
foo_client-2015.2/foo_client.egg-info/PKG-INFO
foo_client-2015.2/setup.cfg
foo_client-2015.2/PKG-INFO
foo_client-2015.2/foo_client/
foo_client-2015.2/foo_client/models.py
...

背景

如果安装了 zipped eggs,pip 似乎有时会安装几次包。

更新

我发现包在什么情况下作为 egg 安装:如果它是通过 python setup.py develop 安装的(它是 install_requires 依赖)。

如果我使用 pip install foo_client 它会平整安装(我想要的方式)。

更新2

非常丑陋的部分:如果安装了 egg,则不会删除安装的旧版本。

版本:pip 1.5.6

我遇到了这个 egg-only 安装问题,结果我没能 git 在我的根目录中添加 __init__.py包裹。这行得通让我发疯:

pip install .

...但这会失败:

mkdir /tmp/piptest
cd /tmp/piptest
git clone $OLDPWD .
pip install .

很难注意到使用 diff -r . $OLDPWD 的差异,因为有太多未提交的 pyc 文件和开发工具脚本。

这可能不是此 OP 的答案,但我希望它能帮助像我一样使用 Google "pip only installing the egg" 的人。

如果您是包的 作者,您可以在 setup.py.

中使用标志 zip_safe=False
setup(
    name = "HelloWorld",
    ...
    zip_safe = False,
)

如果您是用户想要改进软件包,您可以通过pip install -e foo_package安装它。选项 -e--editable 以可编辑模式(即 setuptools“开发模式”)安装项目,而不是压缩。它从源代码创建一个 link 到 site-packages 并编译 .../bin 脚本,但它不会将源代码复制到“站点包”中。这些包不能自动更新。这是为什么它不是作为安装包的常用方式,而是仅用于那些需要定制或修复的包的主要原因。

编辑:Django 是一个典型的框架,它的应用程序需要 zip_safe=False,因为它们不是纯粹的 Python,但它们还包含带有 html 的模板, css, i18n resources 等。您的问题与 Django 相关吗?

这并没有解决为什么我有时会收到压缩鸡蛋,有时却没有的问题。但它有帮助。

您可以在 ~/.distutils.cfg 中使用它来避免安装压缩蛋:

[easy_install]
zip_ok = False

Some docs 说:

For maximum performance, Python packages are best installed as zip files.

You can pass a True or False value for the zip_safe argument to the setup() function, or you can omit it. If you omit it, the bdist_egg command will analyze your project’s contents to see if it can detect any conditions that would prevent it from working in a zipfile.

所以它可能没问题,除非......它对你的情况不好。我的项目试图读取文件但由于压缩而失败。

值得注意的是,这只发生在 python setup.py install,而不是 pip install . @guettli 的修复工作正常,但我把它放在 setup.cfg:

[easy_install]
zip_ok = False

我遇到了与@guettli 相同的问题,并通过先解压缩和解压缩存档然后 运行:

解决了这个问题

pip -e 安装/srv/mypkg-1.1.0

其中 /srv/mypkg-1.1.0/ 是 project/package 的顶级目录,其中有一个 setup.py 文件。

mypkg-1.1.0 已安装在站点包中,mypkg.py 已在 [virtualenv]/bin

中列出

注意:“-e”标志是可选的。

谢谢