通常,当我开发一个供个人使用的Python包时,我会使用python3 setup.py develop
,然后在另一个虚拟环境中执行pip3 install -e <path_to_package>
,从而允许我同时使用两者。当我执行gpip3 freeze
时,我在本地计算机上看到包的路径:
-e /Users/myName/Documents/testpackage
当我将该包存储在 GitHub 上并将其克隆回本地机器时,我希望能够以相同的方式使用setup.py develop
并在本地计算机上继续开发包,无论我是否或何时推送回 GitHub。但是,当我做gpip3 freeze
时,我看到:
-e git+git@github.com:github_username/repo_name@-----latest_commit's_sha_code-----#egg=repo_name&subdirectory=xx/xx/testpackage
我希望我的系统跟踪本地版本而不是 git 的远程版本。
注意:我知道如何将本地更改提交并推送到 GitHub 并在本地环境中安装 egg。我的目标是使用软件包的开发版本快速测试想法,而无需持续集成。
注2:gpip3 freeze
中给出的GitHub地址在环境中尝试时失败(FileNotFoundError: [Errno 2] No such file or directory: '/Users/myName/Documents/testenvironment/src/testpackage/setup.py'
(
但是,如果我想让 pip3 安装最新的 GitHub 提交,我无论如何都不会为setup.py develop
而烦恼。
有没有办法向 setup.py 发出信号,我希望它忽略克隆存储库中的远程并只注意本地路径?还是在显示设置工具的预期行为时始终引用远程?
更新: 当遥控器不存在时,python3 setup.py develop
后gpip3 freeze
输出的措辞(如下(使我认为尽可能跟踪遥控器可能是预期的行为:
# Editable Git install with no remote (testpackage ==0.0.1)
-e /Users/myName/Documents/testpackage
我一直在通过git remote remove origin
来解决这个问题,当我希望我的本地更改反映在本地环境中而不推送新提交时,尽管对我来说并不理想。
我的问题源于对如何实现python3 setup.py develop
的误解。
我最初的方法是:
1(从软件包目录本身中python3 setup.py develop
,这将全局安装/链接蛋
2(gpip3 freeze
获取(我认为(鸡蛋的链接(在这里看到所有额外的git远程信息让我感到困惑(
3(cd
到另一个虚拟环境,source bin/activate
,然后调用pip3 install -e <link_copied_from_global_pip_freeze>
实际上,无需从正在开发的包中调用python3 setup.py develop
,也无需使用gpip3 freeze
来获取 egg 链接。
我可以直接转到虚拟环境并激活它,然后使用pip3 install -e <system_path_to_package_directory_containing_setup.py>
.这将在包目录中创建一个 egg 链接(如果尚不存在(。包内的编辑会按预期反映在虚拟环境中,我可以根据需要在包内自由使用 Git 版本控制,而不会受到干扰。
我认为有时可能会直接调用python3 setup.py develop
(setup.py develop --user
也存在(,但是如果不这样做,我碰巧避免了用额外的软件包乱扔我的全球环境。
来自 Python Disutils 线程中 2014 年问题的相关信息:
提问者写道:
多年来,我一直在推荐:
$ 蟒蛇 setup.py 开发
[...]
话虽如此,我还注意到:
$ 点安装 -e .
做同样的事情。
我应该推荐一个而不是另一个吗?
诺亚回答:
您应该建议使用它的pip,主要是因为正如您所说,即使不使用setuptools的软件包也可以使用:-(在使用附加功能进行开发安装时也需要它,尽管由于 pip 中的错误,这需要稍微更冗长的语法。