Pip: AttributeError : 'NoneType'κ°œμ²΄μ— 'is_hash_allowed'속성이 μ—†μŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2019λ…„ 07μ›” 23일  Β·  18μ½”λ©˜νŠΈ  Β·  좜처: pypa/pip

ν™˜κ²½

  • pip 버전 : 19.2
  • Python 버전 : 3.6.8
  • OS : Mac OSX (Darwin Kernel 버전 18.6.0)

기술
λ‚΄ ν”„λ‘œμ νŠΈμ—μ„œ pip도 ν¬ν•¨ν•˜μ—¬ env μ—…λ°μ΄νŠΈλ₯Ό λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€. κ·Έ ν›„ λͺ…λ ΉμœΌλ‘œ 였래된 νŒ¨ν‚€μ§€λ₯Ό ν™•μΈν•˜κ³  μ‹Άμ—ˆμŠ΅λ‹ˆλ‹€.

pip list --outdated --format=columns

κ·Έ ν›„ μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

μ˜ˆμƒλ˜λŠ” 행동
νŒ¨ν‚€μ§€ λͺ©λ‘ λ˜λŠ” 빈 λͺ©λ‘μ„ μ˜ˆμƒν–ˆμŠ΅λ‹ˆλ‹€.

μž¬ν˜„ 방법

  1. PyPIμ—μ„œ μ΅œμ‹  λ²„μ „μ˜ νŒ¨ν‚€μ§€λ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€.
  2. 그런 λ‹€μŒ pip list --outdated --format=columns
  3. 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

μ‚°μΆœ

(env) project (develop) $ pip list --outdated --format=columns
ERROR: Exception:
Traceback (most recent call last):
  File "/project/env/lib/python3.6/site-packages/pip/_internal/cli/base_command.py", line 188, in main
    status = self.run(options, args)
  File "/project/env/lib/python3.6/site-packages/pip/_internal/commands/list.py", line 156, in run
    packages = self.get_outdated(packages, options)
  File "/project/env/lib/python3.6/site-packages/pip/_internal/commands/list.py", line 164, in get_outdated
    dist for dist in self.iter_packages_latest_infos(packages, options)
  File "/project/env/lib/python3.6/site-packages/pip/_internal/commands/list.py", line 164, in <listcomp>
    dist for dist in self.iter_packages_latest_infos(packages, options)
  File "/project/env/lib/python3.6/site-packages/pip/_internal/commands/list.py", line 195, in iter_packages_latest_infos
    best_candidate = evaluator.get_best_candidate(all_candidates)
  File "/project/env/lib/python3.6/site-packages/pip/_internal/index.py", line 729, in get_best_candidate
    best_candidate = max(candidates, key=self._sort_key)
  File "/project/env/lib/python3.6/site-packages/pip/_internal/index.py", line 710, in _sort_key
    has_allowed_hash = int(link.is_hash_allowed(self._hashes))
  File "/project/env/lib/python3.6/site-packages/pip/_internal/models/link.py", line 213, in is_hash_allowed
    return hashes.is_hash_allowed(self.hash_name, hex_digest=self.hash)
AttributeError: 'NoneType' object has no attribute 'is_hash_allowed'
lisshow auto-locked bug

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

μˆ˜μ • 사항은 λ§ˆμŠ€ν„°μ— μžˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 였늘 κΈ΄ ν•˜λ£¨λ₯Ό 보낸 ν›„ μ•½κ°„μ˜ νœ΄μ‹μ„ μ·¨ν•˜λ©΄μ„œ 쑰금 후에 릴리슀λ₯Ό ν•  κ²ƒμž…λ‹ˆλ‹€.

λͺ¨λ“  18 λŒ“κΈ€

@ptynecki 이 문제λ₯Ό

/ cc @cjerdonek κ·Έκ°€ μ½”λ“œλ² μ΄μŠ€μ˜μ΄ λΆ€λΆ„μ—μ„œ μΌν–ˆκ³  λ‚˜λ³΄λ‹€ 그것에 더 μ΅μˆ™ν–ˆκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

Windows 10, Python 3.7.3μ—μ„œ λ™μΌν•œ 문제

Ubuntu 18.04.2 LTS, Python 3.6.8μ—μ„œ λ™μΌν•œ 문제

macOS 18.6.0 및 Python 3.7.4μ—μ„œ λ™μΌν•œ 문제

Windows 10, Python 3.7.4μ—μ„œ λ™μΌν•œ 문제

Fedora 29, Python 3.7.3μ—μ„œ λ™μΌν•œ λ¬Έμ œμž…λ‹ˆλ‹€.

μ§€κΈˆμ€ ν•΄κ²° λ°©λ²•μœΌλ‘œ ...

python3 -m pip install -UI --user  'pip<19.2'

pip 버전 19.1.1을 λ‹€μ‹œ μ„€μΉ˜ν–ˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ™„μ „ν•œ λͺ…λ Ή 좜λ ₯이 κΆκΈˆν•©λ‹ˆλ‹€.

$ python3 -m pip install -UI --user  'pip<19.2'
Collecting pip<19.2
  Using cached https://files.pythonhosted.org/packages/5c/e0/be401c003291b56efc55aeba6a80ab790d3d4cece2778288d65323009420/pip-19.1.1-py2.py3-none-any.whl
Installing collected packages: pip
Successfully installed pip-19.2

Successfully installed pip-19.2 λ³΄κ³ ν•˜λŠ” μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ?

μ—¬λŸ¬ OSμ—μ„œ λ°œμƒν•˜λŠ” 것을 확인해 μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€!

μ—¬λŸ¬λΆ„, 같은 λ¬Έμ œμ— μ§λ©΄ν–ˆλ‹€λ©΄ μΆ”κ°€ λŒ“κΈ€μ„ μ˜¬λ¦¬μ§€ λ§ˆμ‹­μ‹œμ˜€. GitHub λ°˜μ‘μ„ μ‚¬μš©ν•˜μ—¬ 첫 번째 κ²Œμ‹œλ¬Όμ„ μ°¬μ„±ν•˜κ³  문제λ₯Ό κ΅¬λ…ν•˜μ‹­μ‹œμ˜€.

μ΄λ ‡κ²Œν•˜λ©΄ κ΄€λ¦¬μžκ°€μ΄ λ¬Έμ œμ—μ„œμ΄ 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 방법에 λŒ€ν•΄ ν† λ‘  ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μΆ”κ°€ "λ‚˜λ„"주석은 λˆ„κ΅¬μ—κ²Œλ„ λ„μ›€μ΄λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

흠, μœ ν˜• 검사기가 μ—¬κΈ°μ„œ μ‹€νŒ¨ν•œ 것 κ°™μŠ΅λ‹ˆλ‹€. μœ ν˜• μ£Όμ„μ—λŠ” hashes κ°€ None이 μ•„λ‹ˆμ–΄μ•Όν•˜μ§€λ§Œλ³΄κ³  된 μ‚¬λ‘€μ—μ„œλŠ” Noneμž…λ‹ˆλ‹€. https://github.com/pypa/pip/blob/369ec7c0a8a81a076ca5584c34c8530d7a30a220/src/pip/_internal/models/link .py # L202 -L209

잠깐 μ‚΄νŽ΄λ³΄λ©΄, hashes κ°€ None 인 경우 False λ₯Ό λ°˜ν™˜ν•˜λ„λ‘ Link.is_hash_allowed(hashes) λ₯Ό μ—…λ°μ΄νŠΈν•˜κ³  맀개 λ³€μˆ˜λ₯Ό μ—…λ°μ΄νŠΈν•˜μ—¬ 주석을 μ •λ ¬ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. ~ Optional[Hashes] ). hashes μΈμˆ˜κ°€ 항상 λΉ„ None μž„μ„ 보μž₯ν•˜κΈ° μœ„ν•΄ μ—¬λŸ¬ μœ„μΉ˜μ—μ„œ ν•­λͺ©μ„ μ—…λ°μ΄νŠΈν•˜λŠ” 것보닀이 μ‹œμ μ—μ„œ 더 κ°„λ‹¨ν•˜κ³  ν™•μ‹€ν•©λ‹ˆλ‹€. μœ ν˜• 검사기에 κΈ°λŒ€μ–΄ 100 % ν™•μ‹€ν•˜κ²Œ ν™•μΈν•˜μ‹­μ‹œμ˜€.

μœ ν˜• 검사기가 μ—¬κΈ°μ„œ μ‹€νŒ¨ν•œ 것 κ°™μŠ΅λ‹ˆλ‹€.

μ•„. λ„€-strict_optional은 pip._internal.index λŒ€ν•΄ False이며 이것이 λ°”λ‘œ μ‹€νŒ¨μž…λ‹ˆλ‹€.

100 % ν™•μ‹€ν•˜κ²Œ ν™•μΈν•˜κΈ° μœ„ν•΄ μœ ν˜• 검사기에 μ˜μ§€ ν•  μˆ˜μ—†λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

예, 점진적 채택을 μœ„ν•΄ μ΄λŸ¬ν•œ ν”Œλž˜κ·Έκ°€μžˆλŠ” ν•œ μ™„μ „νžˆ μ‹ λ’°ν•  μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€.

μ•„. λ„€-strict_optional은 pip._internal.index에 λŒ€ν•΄ False이며 이것이 λ°”λ‘œ μ‹€νŒ¨μž…λ‹ˆλ‹€.

그리고 ν•¨μˆ˜κ°€ μ •μ˜ 된 models/link.py 에도 strict_optional ν™œμ„±ν™”λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

μ•Œκ² μŠ΅λ‹ˆλ‹€. PR # 6774λ₯Ό κ²Œμ‹œν–ˆμŠ΅λ‹ˆλ‹€.

이 λ¬Έμ œλŠ” (패치 λ¦΄λ¦¬μŠ€κ°€ μ•„λ‹Œ 19.3의 경우) μ΄ν›„μ˜ 쒋은 λ‹¨κ³„λŠ” index.py 에 λŒ€ν•΄ strict_optional μΌœλŠ” κ²ƒμž…λ‹ˆλ‹€ ..

ν•¨μˆ˜κ°€ μ •μ˜ 된 models / link.py에도 strict_optional이 ν™œμ„±ν™”λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

예-mypyλŠ” 호좜 μ‚¬μ΄νŠΈμ˜ κ·œμΉ™μ„ μ‚¬μš©ν•˜μ—¬ 호좜 μ‚¬μ΄νŠΈμ—μ„œ ν™•μΈν•©λ‹ˆλ‹€.


κ·€ν•˜κ°€ μ œμ•ˆν•œ μˆ˜μ • 사항 및 PR은 λ‚˜μ—κ²Œ 잘 λ³΄μž…λ‹ˆλ‹€. λ‹€λ₯Έ λ¬Έμ œκ°€ λ°œμƒν•˜μ§€ μ•ŠμœΌλ©΄ 였늘 저녁에 버그 μˆ˜μ • 릴리슀λ₯Ό μˆ˜ν–‰ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ§€κΈˆλΆ€ν„° 3 ~ 5 μ‹œκ°„ ν›„μž…λ‹ˆλ‹€.

λ‹€λ₯Έ λ¬Έμ œκ°€ λ°œμƒν•˜μ§€ μ•ŠμœΌλ©΄ 였늘 저녁에 버그 μˆ˜μ • 릴리슀λ₯Ό μˆ˜ν–‰ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ§€κΈˆλΆ€ν„° 3 ~ 5 μ‹œκ°„ ν›„μž…λ‹ˆλ‹€.

그것은 쒋을 κ²ƒμž…λ‹ˆλ‹€. κ·Έλ ‡κ²Œ ν•΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš”. FWIW 19.2μ—μ„œμ΄ 버그와 κ΄€λ ¨μ΄μ—†λŠ” 버그λ₯Ό λ°œκ²¬ν–ˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 그것을 μ—¬μ „νžˆ νŒŒμ•…ν•˜λ €κ³  λ…Έλ ₯ν•˜κ³  있으며 λ‚˜μ€‘μ— μƒˆλ‘œμš΄ 문제λ₯Ό μ—΄ β€‹β€‹κ²ƒμž…λ‹ˆλ‹€.

νŽΈμ§‘ν•˜λ‹€:
μ•„, λˆ„κ΅°κ°€ 이미 https://github.com/pypa/pip/issues/6775 ν•˜λ‚˜λ₯Ό μ—΄μ—ˆμŠ΅λ‹ˆλ‹€.

μˆ˜μ • 사항은 λ§ˆμŠ€ν„°μ— μžˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 였늘 κΈ΄ ν•˜λ£¨λ₯Ό 보낸 ν›„ μ•½κ°„μ˜ νœ΄μ‹μ„ μ·¨ν•˜λ©΄μ„œ 쑰금 후에 릴리슀λ₯Ό ν•  κ²ƒμž…λ‹ˆλ‹€.

이 버그 μˆ˜μ •μ΄ 포함 된 λ¦΄λ¦¬μŠ€κ°€ μ—…λ‘œλ“œλ˜μ—ˆμŠ΅λ‹ˆλ‹€. λͺ¨λ‘μ—κ²Œ κ°μ‚¬ν•©λ‹ˆλ‹€ (특히 @cjerdonek)! :)

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰