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

16 投票
3 回答
7354 浏览
提问于 2025-04-16 18:46

我正在开发一个软件包,这个软件包已经作为一个“蛋”文件安装在了 site-packages 目录里,并且它的路径已经添加到 easy-install.pth 文件中。

现在我发现这个软件包里有个 bug,于是我运行了 python setup.py develop 来连接我的开发目录。源代码目录的路径确实被正确添加到了 easy-install.pth 中,但它是最后添加的,这意味着当我执行 import mypackage 时,已经安装的“蛋”文件会被优先选择和导入。

我该如何让开发版本覆盖掉已经安装的这个软件包呢?

如果我这样做不对,请告诉我解决这个问题的正确方法是什么。

3 个回答

1

我建议使用虚拟环境,也就是一个独立的Python安装,它不会受到系统中其他安装的影响。你可以去PyPI上看看virtualenv和virtualenvwrapper这两个工具。

3

你可以使用 pip 来更新当前已经安装的包,只需要加上 --upgrade 这个选项。此外,pip 还可以从本地文件夹安装包,所以你可以这样做:

easy_install pip # if you don't have pip installed
pip install /your/package --upgrade
5

如果你在使用 pip 这个工具,

sudo pip uninstall packagename

它会提示你确认删除所有在 easy-install.pth 文件里的包,确认后就会把它们全部删掉。

然后你可以运行 setup.py develop,这样就只会把开发版本放到 Python 的路径里。

如果你需要同一个库的多个版本,最好的办法是使用 virtualenv(还有 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')

这样,导入时就能从正确的位置获取到包。

撰写回答