環境
説明
gitリポジトリからローカルディレクトリにパッケージをインストールすることができます。
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
依存関係として、スペースを含むパスでローカルgitリポジトリを指定します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が直接実行されるときの引用符の処理は、シェルによって制御されます。 たとえば、Bashでは、ネストされていない引用符のペアが削除され、その内容が前後に連結されて各引数が作成されます。
一方、要件ファイルはoptparseによってそのまま読み取られ、特別な見積もりの処理やストリッピングは行われません。
ただし、この場合、URLを提供しようとするときは、無効なURL文字(スペースなど)をパーセントエンコードする必要があります(スペースは%20)。 パスにスペースが含まれているgitリポジトリを正常にインストールする例については、次のスクリプトを参照してください。
repro.sh
#!/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))
本当にありがとうございました!!
SOの質問に答えますか? それ以外の場合は、よろしければ、答えとしてあなたの説明を引用します。
好奇心からこの問題を解決しますが、これはWindowsのみの問題ですか? SOのユーザー00によると、Macでは%20がなくても機能するためです。
お役に立ててうれしいです。 :)
先に進んでください!
動作がプラットフォーム固有である場合、私は少し驚かれることでしょう。 ここでのコードはURLを分割するものである必要があり、プラットフォーム間で変更されるものは何も表示されません。 いずれにせよ、パーセントエンコードは箱から出してすぐに機能するはずなので、他のプラットフォームで他の方法で機能させる可能性のある人にとっても、間違いなくそれが道です。