如何使用 pip 从 git 子目录安装?

Posted

技术标签:

【中文标题】如何使用 pip 从 git 子目录安装?【英文标题】:How can I install from a git subdirectory with pip? 【发布时间】:2012-11-14 00:13:48 【问题描述】:

我有一个包含许多文件夹的 git 存储库,其中一个是可通过 pip 安装的 python 模块,如下所示:

repo.git/
repo.git/folder1/
repo.git/folder2/
repo.git/mymodule/
repo.git/mymodule/__init__.py
repo.git/mymodule/setup.py
repo.git/mymodule/...

现在我必须执行以下操作才能安装:

git clone http://server/repo.git
cd repo
pip install mymodule
cd ..
rm -rf repo

是否可以直接用 pip 安装模块而无需显式克隆?

我试过了:

pip install git+https://server/repo.git/mymodule/
pip install git+https://server/repo.git:mymodule/

但我明白了:

IOError: [Errno 2] No such file or directory: '/tmp/pip-88tlLm-build/setup.py'

【问题讨论】:

这个问题好像已经回答了:***.com/questions/10847764/pip-install-from-git-repo 您链接的问题是关于丢失文件的问题,因为没有 MANIFEST.in。我的问题是关于如何使用 pip 安装子目录,没有文件丢失,因为我可以通过克隆整个 repo 来安装包。 @synthesizerpatel 您链接到的问题询问了不同的事情,但标题具有误导性,因此我对其进行了更正。你可以考虑删除你的(我猜的)downvote。 【参考方案1】:

有一个pull request关于这个特性,并且似乎在一个月前已经合并到开发分支。语法是following:

pip install -e git+https://git.repo/some_repo.git#egg=version_subpkg&subdirectory=repo # install a python package from a repo subdirectory

我们可能需要等待一段时间,直到它被合并到 master 并被分发。

更新:现在可以在https://pip.pypa.io/en/stable/cli/pip_install/#vcs-support 获得并记录如下:

对于 setup.py 不在项目根目录的项目, 使用“子目录”组件。 “子目录”组件的值 应该是从项目根目录到 setup.py 的路径 位于。

因此,如果您的存储库布局是:

- pkg_dir/
  - setup.py  # setup.py for package ``pkg``
  - some_module.py
- other_dir/
  - some_file
- some_other_file

你需要使用

pip install -e vcs+protocol://repo_url/#egg=pkg&subdirectory=pkg_dir

注意:在 Windows 上,您必须将 URL 放在双引号中,否则您会收到错误消息“'subdirectory' 未被识别为内部或外部命令”。例如,使用:

pip install -e "vcs+protocol://repo_url#egg=pkg&subdirectory=pkg_dir"

【讨论】:

我刚刚检查过,它是 pip v1.5 的一部分,于 2014 年 1 月 1 日发布:github.com/pypa/pip/blob/develop/CHANGES.txt 如果您使用的是 ubuntu,请确保在实际 git 位置之前使用单引号,否则 & 子目录将被忽略!例如:pip install -e 'git+git.repo/…' 提醒一下:对于 入口点 位于子目录。 pip install -e 'git+https://…/repo.git@branch#egg=package&subdirectory=package' 导致软件包 appearing 安装,package.egg-link 文件被放入 site-packages — 但它指向 src/repo 的根目录,不是src/repo/package,正如我所料。这意味着py_modules 不能被导入,entry_points 实际上不起作用:它们都引发了ImportError: No module named package -e 似乎是必要的,否则pip freeze 不会显示整个路径,只会显示鸡蛋。这发生在pip-1.5.4 给其他人的提示:你必须使用 git+https,git+git 将不起作用,你会得到致命的:远程错误:找不到存储库。大概是因为它没有正确解析“查询”字符串。我刚刚登录:github.com/pypa/pip/issues/4898【参考方案2】:

它已经在one of the comments 的正确答案下进行了说明,但只是为了强调这个问题:从 Linux 命令行执行此操作时,您必须转义 &-字符,因为 & 是告诉命令行在后台运行命令:

git+https://git.repo/some_repo.git#egg=version_subpkg\&subdirectory=repo

注意 & 符号前的反斜杠。转义行为可能取决于 Linux 发行版;我不是专家。 如果您忽略这一点,您可能会遇到如下神秘错误:

bash: (...) command not found

【讨论】:

将 url 括在单引号中有助于避免转义 & 符号的需要吗?我知道这在处理 cURL 中的 URL 时很有帮助。 另外值得注意的是:从 Windows 命令行执行此操作时,必须将 URL 放在双引号中,否则会出现错误“'子目录'不被识别为内部或外部命令” .例如,使用 pip install -e "git+myurl/proj#egg=subpkg&subdirectory=subdir" 一般来说,在使用 shell 脚本时,为了安全起见,在参数周围使用双引号。有关更多最佳实践,请参阅:shellcheck.net 或 github.com/koalaman/shellcheck 在 OSX 中也需要转义(因为它是一种 Linux 发行版) 对于基于分支的安装使用:pip install git+ssh://git@github.com/org_or_username/repo.git@branch#subdirectory=path/to/dubdir

以上是关于如何使用 pip 从 git 子目录安装?的主要内容,如果未能解决你的问题,请参考以下文章

如何 pip 卸载使用 git 项目 URL 安装的包?

python pip - 从本地目录安装

使用 pip 安装特定的 git commit

pip:从远程 git 存储库中提取更新

如何使用 pip 从本地缓存安装?

如何使用 pip 卸载可编辑包(使用 -e 安装)