如何从带有pip的git子目录安装?

J. *_*rde 72 python git pip

我有一个包含许多文件夹的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/...
Run Code Online (Sandbox Code Playgroud)

现在我必须执行以下安装:

git clone http://server/repo.git
cd repo
pip install mymodule
cd ..
rm -rf repo
Run Code Online (Sandbox Code Playgroud)

是否可以直接使用pip安装模块而无需明确克隆?

我试过了:

pip install git+https://server/repo.git/mymodule/
pip install git+https://server/repo.git:mymodule/
Run Code Online (Sandbox Code Playgroud)

但我得到:

IOError: [Errno 2] No such file or directory: '/tmp/pip-88tlLm-build/setup.py'
Run Code Online (Sandbox Code Playgroud)

Den*_*zov 96

有一个关于此功能的拉取请求,似乎已经合并到一个月前开发分支.语法如下:

pip install -e git+https://git.repo/some_repo.git#egg=version_subpkg&subdirectory=repo # install a python package from a repo subdirectory
Run Code Online (Sandbox Code Playgroud)

我们可能需要等待一段时间,直到它合并为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
Run Code Online (Sandbox Code Playgroud)

你需要使用

pip install -e vcs+protocol://repo_url/#egg=pkg&subdirectory=pkg_dir
Run Code Online (Sandbox Code Playgroud)

注意:在Windows上,您必须将URL放在双引号中,否则您将收到错误"'子目录'未被识别为内部或外部命令".例如,使用:

pip install -e "vcs+protocol://repo_url#egg=pkg&subdirectory=pkg_dir"
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用的是ubuntu,请确保在实际的git位置之前使用单引号,否则将忽略&子目录!例如:pip install -e'git + https://git.repo/some_repo.git#egg=version_subpkg&subdirectory=version_subpkg' (17认同)
  • 只是单挑:对于*入口点*位于子目录中的软件包,这似乎不起作用(至少在pip v1.5.6上,不确定大约6个版本).`pip install -e'git + https:// .../repo.git @ branch#egg = package&subdirectory = package'`导致包*出现*安装,并且`package.egg-link`文件被放入site-packages - 但它指向`src/repo`的根目录,*not*到`src/repo/package`,正如我所料.这意味着无法导入`py_modules`,并且`entry_points`实际上不起作用:它们都引发了`ImportError:No module named package`. (7认同)
  • 我刚刚检查过,它是2014年1月1日发布的pip v1.5的一部分:https://github.com/pypa/pip/blob/develop/CHANGES.txt (4认同)
  • `-e`似乎是必要的,否则`pip freeze`不显示整个路径,只显示蛋.这发生在`pip-1.5.4`上 (2认同)
  • 给别人的提示:您必须使用git + https,git + git无法正常工作,但会致命:远程错误:未找到存储库。大概是因为它没有正确解析“查询”字符串。我刚刚登录:https://github.com/pypa/pip/issues/4898 (2认同)

rin*_*ahn 20

在正确答案的其中一条评论中已经说明了这一点,但只是为了强调这个问题:从Linux命令行执行此操作时,必须转义&字符,因为&符告诉命令行在后台运行命令:

git+https://git.repo/some_repo.git#egg=version_subpkg\&subdirectory=repo
Run Code Online (Sandbox Code Playgroud)

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

bash: (...) command not found
Run Code Online (Sandbox Code Playgroud)

  • 对于基于分支的安装,请使用:`pip install git+ssh://git@github.com/org_or_username/repo.git@branch#subdirectory=path/to/dubdir` (7认同)
  • 将 url 用单引号括起来是否有助于避免转义 & 符号?我知道这在使用 cURL 中的 URL 时很有帮助。 (3认同)
  • 转义在OSX中也是必要的(因为它是一种Linux发行版) (2认同)