环境
描述
我能够从 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
失败。
预期行为
期望从本地目录安装软件包,就像我直接运行命令时一样。
如何繁殖
requirements.txt
的依赖项pip install -r requirements.txt
输出
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 问题。
直接执行 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 的内容,我看不到任何跨平台会发生变化的内容。 在任何情况下,百分比编码都应该开箱即用,因此即使对于可能在其他平台上以其他方式工作的人来说,这绝对是一种可行的方法。