Lingkungan
Keterangan
Saya dapat menginstal paket dari git repo di direktori lokal seperti:
pip install git+file:///"k/my/path with/lots of/spaces/repo/.git/"
Namun ketika saya memasukkan git+file:///"k/my/path with/lots of/spaces/repo/.git/"
ke requirements.txt
dan kemudian mencoba menginstal dengan pip install -r requirements.txt
gagal dengan ValueError: No closing quotation
.
Perilaku yang diharapkan
Diharapkan paket diinstal dari direktori lokal seperti ketika saya menjalankan perintah secara langsung.
Cara Mereproduksi
requirements.txt
pip install -r requirements.txt
Keluaran
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
Lihat juga pertanyaan SO terkait .
Penanganan kutipan ketika pip dieksekusi secara langsung diatur oleh shell Anda. Di Bash, misalnya, pasangan kutipan yang tidak bersarang dilucuti dan isinya digabungkan dengan apa yang muncul sebelum/sesudah untuk membuat setiap argumen.
File persyaratan, di sisi lain, dibaca apa adanya oleh optparse dan tidak ada penanganan kutipan khusus atau pengupasan yang terjadi.
Yang mengatakan, dalam hal ini ketika mencoba memberikan URL, karakter URL yang tidak valid (seperti spasi) harus dikodekan persen (spasi adalah %20). Lihat skrip ini untuk contoh yang berhasil menginstal git repo yang memiliki spasi di jalur:
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
Keluaran
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))
Ini berhasil terima kasih banyak!!
Apakah Anda ingin menjawab pertanyaan SO? Kalau tidak, saya akan mengutip penjelasan Anda sebagai jawabannya, jika Anda tidak keberatan.
Saya akan menutup masalah ini, karena penasaran, apakah ini hanya masalah Windows? Karena menurut pengguna 00 di SO, ini berfungsi untuknya tanpa %20 di Mac.
Saya senang itu membantu. :)
Tolong pergilah!
Saya akan sedikit terkejut jika perilakunya khusus untuk platform. Kode di sini seharusnya yang memisahkan URL dan saya tidak melihat apa pun yang akan berubah di seluruh platform. Bagaimanapun, penyandian persen harus bekerja di mana-mana di luar kotak sehingga pasti cara untuk pergi bahkan untuk orang-orang yang mungkin membuatnya bekerja dengan cara lain di platform lain.