如何使用 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 子目录安装?的主要内容,如果未能解决你的问题,请参考以下文章