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


103

我有一个带有许多文件夹的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'


1
您链接的问题是关于缺少文件,因为没有MANIFEST.in。我的问题是关于如何使用pip安装子目录,没有文件丢失,因为我可以通过克隆整个仓库来安装软件包。
J. Martinot-Lagarde 2012年

@synthesizerpatel您链接到的问题询问的是其他问题,但标题具有误导性,因此我进行了更正。您可以考虑删除您(我想)的否决票。
Piotr Dobrogost 2012年

Answers:


119

有一个关于此功能的请求请求,它似乎已经在一个月前合并到了开发分支中。语法如下

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.readthedocs.io/en/stable/reference/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用双引号引起来,否则会出现错误“无法将'子目录'识别为内部或外部命令”。例如,使用:

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

4
我刚刚检查了一下,它是2014年1月1日发布的pip v1.5的一部分:github.com/pypa/pip/blob/develop/CHANGES.txt
tomka

20
如果您正在使用ubuntu,请确保在实际git位置之前使用单引号,否则&sub目录将被忽略!例如:PIP安装-e '混帐+ git.repo / ... '

7
请注意:对于入口点位于子目录中的软件包,这似乎不起作用(至少在pip v1.5.6上不确定,不确定6个以上版本)。pip install -e 'git+https://…/repo.git@branch#egg=package&subdirectory=package'结果在包出现安装和package.egg-link文件放在站点包得到-但它指向的根目录下src/reposrc/repo/package,因为我期望的那样。这意味着py_modules无法导入,并且entry_points实际上不起作用:它们都引发ImportError: No module named package
Mark G.

2
-e似乎是必要的,否则pip freeze不会显示完整的路径,仅显示鸡蛋。这发生在pip-1.5.4
zyxue 2016年

2
给别人的提示:您必须使用git + https,git + git无法正常工作,但会致命:远程错误:找不到存储库。大概是因为它没有正确解析“查询”字符串。我刚登录:github.com/pypa/pip/issues/4898
amohr '17

33

已经在正确答案下的注释之一中指出了这一点,但只是为了强调此问题:从Linux命令行执行此命令时,必须逃脱&-character,因为&符告诉命令行在后台运行命令:

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

注意在“&”号之前的反斜杠。转义行为可能取决于Linux发行版。我不是专家。
如果您忽略此设置,则可能会遇到类似以下的神秘错误:

bash: (...) command not found

1
将网址括在单引号中是否有助于避免转义“&”号的需要?我知道在使用cURL中的URL时很有帮助。
乔什·皮克

1
另外值得注意的是:从Windows命令行执行此操作时,必须将URL放在双引号中,否则会出现错误“无法将'子目录'识别为内部或外部命令”。例如,使用pip install -e“ git + myurl / proj#egg = subpkg&subdirectory = subdir

通常,在使用Shell脚本时,为了安全起见,请在参数周围使用双引号。有关更多最佳做法,请参见:shellcheck.netgithub.com/koalaman/shellcheck
Erik Aronesty

2
在OSX中,转义也是必需的(因为它是一种Linux发行版)
ygesher

6
对于基于分支的安装,请使用:pip install git+ssh://git@github.com/org_or_username/repo.git@branch#subdirectory=path/to/dubdir
RDK
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.