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

时间:2015-01-15 13:53:30

标签: python pip egg

你在哪里可以强迫pip安装为" flat"而不是" egg"。

对我来说似乎是随机的。有时它会像鸡蛋一样安装,有时候会变平。

pip help install仅显示强制安装鸡蛋的选项--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在这里被使用。它是否强制创建鸡蛋安装?

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
...

背景

如果安装了压缩鸡蛋,pip似乎有时会多次安装包。

更新

我发现包在哪个条件下安装为egg:如果它是通过python setup.py develop安装的(它是一个install_requires依赖项)。

如果我使用pip install foo_client,它会被平放(我想要的方式)。

UPDATE2

非常丑陋的部分:如果安装了鸡蛋,那么旧的版本安装不会被删除。

版本:pip 1.5.6

5 个答案:

答案 0 :(得分:6)

这并没有解决为什么我有时会得到拉链蛋,有时候没有。但它有帮助。

您可以在~/.distutils.cfg中使用此功能,以避免安装拉链蛋:

[easy_install]
zip_ok = False

答案 1 :(得分:2)

如果您是该软件包的作者,则可以使用zip_safe=False中的标记setup.py

setup(
    name = "HelloWorld",
    ...
    zip_safe = False,
)

如果您是想要改进软件包的用户,可以按pip install -e foo_package安装。选项-e--editable以可编辑模式(即setuptools“开发模式”)安装项目,而不是压缩。它创建从源到site-packages的链接并编译... / bin脚本,但不会将源复制到site-packages。这些软件包无法自动更新,这是它不是通常的安装软件包的主要原因,而只是那些需要定制或修复的软件包。

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

答案 2 :(得分:1)

我遇到了这个仅限鸡蛋安装问题,结果发现我没有在我的软件包的根目录中添加__init__.py。这让我很生气,这会起作用:

pip install .

......但这会失败:

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

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

这可能不是这个OP的答案,但我希望它可以帮助Googles" pip只安装鸡蛋的人#34;就像我一样。

答案 3 :(得分:1)

我和@guettli有同样的问题,首先解压缩并解压缩,然后运行:

pip -e install /srv/mypkg-1.1.0

其中/srv/mypkg-1.1.0/是项目/包中包含setup.py文件的顶级目录。

mypkg-1.1.0安装在site-packages中,mypkg.py列在[virtualenv] / bin

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

由于

答案 4 :(得分:0)

Some docs说:

  

为了获得最佳性能,最好将Python软件包安装为zip文件。

  

您可以将zip_safe参数的True或False值传递给   setup()函数,或者你可以省略它。如果省略它,则为bdist_egg   命令将分析项目的内容以查看它是否可以检测到   任何阻止它在zip文件中工作的条件。

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

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

[easy_install]
zip_ok = False