Pip: 要件.txtで指定され、パスにスペースが含まれている場合、ローカルディレクトリのgitリポジトリからのインストールは失敗します

作成日 2019年10月18日  ·  3コメント  ·  ソース: pypa/pip

環境

  • pipバージョン:19.3.1
  • Pythonバージョン:3.7.4
  • OS:Windows 10

説明
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

予想される行動
コマンドを直接実行したときと同じように、パッケージがローカルディレクトリからインストールされることを期待していました。

再現する方法

  1. requirements.txt依存関係として、スペースを含むパスでローカルgitリポジトリを指定します
  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が直接実行されるときの引用符の処理は、シェルによって制御されます。 たとえば、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を分割するものである必要があり、プラットフォーム間で変更されるものは何も表示されません。 いずれにせよ、パーセントエンコードは箱から出してすぐに機能するはずなので、他のプラットフォームで他の方法で機能させる可能性のある人にとっても、間違いなくそれが道です。

このページは役に立ちましたか?
0 / 5 - 0 評価