Pip: 如果在 requirements.txt 中指定并且路径包含空格,则从本地目录中的 git repo 安装失败

创建于 2019-10-18  ·  3评论  ·  资料来源: pypa/pip

环境

  • 点子版本:19.3.1
  • Python版本:3.7.4
  • 操作系统:Windows 10

描述
我能够从 git repo 在本地目录中安装一个包,如下所示:

pip install git+file:///"k/my/path with/lots of/spaces/repo/.git/"

但是,当我将git+file:///"k/my/path with/lots of/spaces/repo/.git/"放入我的requirements.txt然后尝试使用pip install -r requirements.txt进行安装时,它会以ValueError: No closing quotation失败。

预期行为
期望从本地目录安装软件包,就像我直接运行命令时一样。

如何繁殖

  1. 在包含空格的路径中指定本地 git repo 作为requirements.txt的依赖项
  2. 然后运行pip install -r requirements.txt
  3. 发生错误。

输出

pip install -r .\requirements.txt
ERROR: Exception:
Traceback (most recent call last):
  File "C:\Users\username\AppData\Local\Continuum\anaconda3\lib\site-packages\pip\_internal\cli\base_command.py", line 178, in main
    status = self.run(options, args)
  File "C:\Users\username\AppData\Local\Continuum\anaconda3\lib\site-packages\pip\_internal\commands\install.py", line 326, in run
    self.name, wheel_cache
  File "C:\Users\username\AppData\Local\Continuum\anaconda3\lib\site-packages\pip\_internal\cli\base_command.py", line 288, in populate_requirement_set
    use_pep517=options.use_pep517):
  File "C:\Users\username\AppData\Local\Continuum\anaconda3\lib\site-packages\pip\_internal\req\req_file.py", line 112, in parse_requirements
    for req in req_iter:
  File "C:\Users\username\AppData\Local\Continuum\anaconda3\lib\site-packages\pip\_internal\req\req_file.py", line 173, in process_line
    shlex.split(options_str), defaults)  # type: ignore
  File "C:\Users\username\AppData\Local\Continuum\anaconda3\lib\shlex.py", line 305, in split
    return list(lex)
  File "C:\Users\username\AppData\Local\Continuum\anaconda3\lib\shlex.py", line 295, in __next__
    token = self.get_token()
  File "C:\Users\username\AppData\Local\Continuum\anaconda3\lib\shlex.py", line 105, in get_token
    raw = self.read_token()
  File "C:\Users\username\AppData\Local\Continuum\anaconda3\lib\shlex.py", line 187, in read_token
    raise ValueError("No closing quotation")
ValueError: No closing quotation

requirements.txt

git+file:///"k/my/path with/lots of/spaces/repo/.git/"
pandas
requests
retrying
xlsxwriter

另请参阅相关的SO 问题

auto-locked support

所有3条评论

直接执行 pip 时对引号的处理由您的 shell 控制。 例如,在 Bash 中,非嵌套的引号对被剥离,它们的内容与之前/之后的内容连接以创建每个参数。

另一方面,需求文件由 optparse 按原样读取,并且不会发生特殊的报价处理或剥离。

也就是说,在这种情况下,当尝试提供 URL 时,无效的 URL 字符(如空格)必须进行百分比编码(空格为 %20)。 有关成功安装路径中包含空格的 git 存储库的示例,请参阅此脚本:


复制文件

#!/bin/sh
cd "$(mktemp -d)"

dir="$PWD/a b c/d e f"
mkdir -p "$dir"
cd "$dir"
cat <<EOF > setup.py
from setuptools import setup

setup(name='example')
EOF

git init
git add .
git commit -m init
cd -


python -V
python -m venv venv
venv/bin/python -m pip install --upgrade pip

cat <<EOF | tee requirements.txt
git+file://$PWD/a%20b%20c/d%20e%20f
EOF

python -m pip install -r requirements.txt


输出

Initialized empty Git repository in /tmp/user/1000/tmp.kITsbsZCPO/a b c/d e f/.git/
[master (root-commit) d347157] init
 1 file changed, 3 insertions(+)
 create mode 100644 setup.py
/tmp/user/1000/tmp.kITsbsZCPO
Python 3.7.2
Collecting pip
  Using cached https://files.pythonhosted.org/packages/00/b6/9cfa56b4081ad13874b0c6f96af8ce16cfbc1cb06bedf8e9164ce5551ec1/pip-19.3.1-py2.py3-none-any.whl
Installing collected packages: pip
  Found existing installation: pip 18.1
    Uninstalling pip-18.1:
      Successfully uninstalled pip-18.1
Successfully installed pip-19.3.1
git+file:///tmp/user/1000/tmp.kITsbsZCPO/a%20b%20c/d%20e%20f
Collecting git+file:///tmp/user/1000/tmp.kITsbsZCPO/a%20b%20c/d%20e%20f (from -r requirements.txt (line 1))
  Cloning file:///tmp/user/1000/tmp.kITsbsZCPO/a b c/d e f to /tmp/user/1000/pip-req-build-ts2s099_
Requirement already satisfied (use --upgrade to upgrade): example==0.0.0 from git+file:///tmp/user/1000/tmp.kITsbsZCPO/a%20b%20c/d%20e%20f in /home/chris/.pyenv/versions/3.7.2/lib/python3.7/site-packages (from -r requirements.txt (line 1))

这工作非常感谢你!!

你想回答这个问题吗? 否则,如果您不介意,我将引用您的解释作为答案。

出于好奇,我将关闭此问题,这是仅适用于 Windows 的问题吗? 因为根据 SO 上的用户 00,它在 Mac 上没有 %20 的情况下适用于他。

我很高兴它有帮助。 :)

请继续!

如果行为是特定于平台的,我会有点惊讶。 此处的代码应该是拆分 URL 的内容,我看不到任何跨平台会发生变化的内容。 在任何情况下,百分比编码都应该开箱即用,因此即使对于可能在其他平台上以其他方式工作的人来说,这绝对是一种可行的方法。

此页面是否有帮助?
0 / 5 - 0 等级