Pip: requirements.txt์— ์ง€์ •๋˜๊ณ  ๊ฒฝ๋กœ์— ๊ณต๋ฐฑ์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ ๋กœ์ปฌ ๋””๋ ‰ํ† ๋ฆฌ์˜ git repo์—์„œ ์„ค์น˜๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2019๋…„ 10์›” 18์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: pypa/pip

ํ™˜๊ฒฝ

  • ํ• ๋ฒ„์ „: 19.3.1
  • ํŒŒ์ด์ฌ ๋ฒ„์ „: 3.7.4
  • ์šด์˜ ์ฒด์ œ: ์œˆ๋„์šฐ 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. requirements.txt ์˜ ์ข…์†์„ฑ์œผ๋กœ ๊ณต๋ฐฑ์ด ํฌํ•จ๋œ ๊ฒฝ๋กœ์— ๋กœ์ปฌ git repo๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  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 repo๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์„ค์น˜ํ•˜๋Š” ์˜ˆ์ œ๋Š” ์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.


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 ๋“ฑ๊ธ‰