使用"python setup.py develop"覆盖已安装的版本。

16

我正在开发一个包。这个包已经作为egg文件安装在site-packages目录中,并将其路径添加到easy-install.pth。

现在我意识到这个包有一个bug,所以我调用了python setup.py develop来连接开发目录。源目录的路径被正确地添加到easy-install.pth,但是它被添加到最后,这意味着已经安装的egg文件将首先被选择和导入,当我输入import mypackage时。

如何让开发钩子覆盖已安装的包?

如果我做错了,请解释一下解决这种情况的正确策略。


你正在使用 distutils 吗?哪个版本? - Ethan Furman
3个回答

5
如果您正在使用pip,
sudo pip uninstall packagename

该命令将提示删除 easy-install.pth 中的所有包,确认后执行删除操作。

然后,您可以运行 setup.py develop 命令,以便只有开发分支在 python 路径中。

如果您需要同一库的多个版本,则最好使用 virtualenv(和 bash 辅助工具 virtualenvwrapper)。

值得一提的是,如果您想要最简单的解决方案且不需要任何网络流量(我无法想象为什么),那么您也可以直接从 site-packages 创建符号链接,例如:

sudo ln -fs ~/django_registration/registration /usr/lib/python2.6/dist-packages/django_registration

如果您使用pip进行软件包安装(为什么不呢?),您也可以通过以下方式将开发版本添加到easy-install.pth中:
pip install -e hg+http://bitbucket.org/ubernostrum/django-registration/#egg=django_registration

更新,基于评论:

如果您想仅在当前模块中使用新包,您可以手动修改sys.path,例如:

sys.path.insert(1,'/path/to/package')

所以,导入从正确的位置开始。

1
重点是我不想删除稳定的软件包。我想覆盖它,至少暂时这样做。这不是一个标准的软件包,它是混淆的,并且它的安装和使用需要我开发的修补过的Python。 - Stefano Borini
1
更新了答案以手动修改sys.path,适用于此情况。 - lprsd
我没有任何可参考的构建包。我可以将其构建为egg,然后按照您指出的方式进行操作,但这将打败开发的整个目的:在不重新构建的情况下进行更改并立即查看它们。我唯一看到的问题是,develop会将新条目添加到easy-install.pth中的最后一个条目,而不是第一个条目,因此先找到已安装的包(也在easy-install.pth中)。 - Stefano Borini
你可以手动将 easy-install.pth 中的路径添加到顶部,如 sys.path.insert(1,'/path/to/package'),对吗? - lprsd
是的,我肯定可以,但我在想这种情况是否是预期的,并且是否有一些神奇的选项可以为我完成它。 - Stefano Borini
1
应该是 sys.path.insert(0,'/path/to/package'),对吧?这意味着它将成为路径中的第一个元素。以防您当前的目录是模块的不同版本(因为''通常是sys.path[0])。 - Jake Biesinger

3
您可以使用--upgrade命令让pip覆盖当前已安装的软件包,同时pip也支持从本地目录安装软件包,因此:
easy_install pip # if you don't have pip installed
pip install /your/package --upgrade

1
应该使用 "install -e" 以开发/可编辑模式安装,即链接而不是复制,以便您的测试运行程序或其他 Python 程序立即看到检出中的更改。 - merwok
OP在他的评论中解释道:“关键是我不想删除稳定的软件包。” - Piotr Dobrogost

1
我会使用虚拟环境,也就是一个独立的 Python 安装,不受系统范围内安装的发行版的影响。请参考 PyPI 上的 virtualenv 和 virtualenvwrapper。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接