2015년 3월 14일 토요일

python3.4 pip install fail

python3.4 환경에서 pip install이 실패하는 문제가 좀 전에 생겼다.
제일 의심스러운 건 얼마 전에 jupyter를 써보겠다고 conda update를 돌리고 jupyter를 설치한 건데 확실하진 않다.

scari@sylvanas:~/codes$ python --version
Python 3.4.3 :: Anaconda 2.1.0 (x86_64)

scari@sylvanas:~/codes$ pip --version
pip 6.0.8 from /Users/scari/anaconda3/lib/python3.4/site-packages (python 3.4)



scari@sylvanas:~/codes$ pip install konlpy
Exception:
Traceback (most recent call last):
  File "/Users/scari/anaconda3/lib/python3.4/site-packages/pip/basecommand.py", line 232, in main
    status = self.run(options, args)
  File "/Users/scari/anaconda3/lib/python3.4/site-packages/pip/commands/install.py", line 339, in run
    requirement_set.prepare_files(finder)
  File "/Users/scari/anaconda3/lib/python3.4/site-packages/pip/req/req_set.py", line 229, in prepare_files
    req_to_install.check_if_exists()
  File "/Users/scari/anaconda3/lib/python3.4/site-packages/pip/req/req_install.py", line 931, in check_if_exists
    self.satisfied_by = pkg_resources.get_distribution(self.req)
  File "/Users/scari/anaconda3/lib/python3.4/site-packages/pip/_vendor/pkg_resources/__init__.py", line 461, in get_distribution
    dist = get_provider(dist)
  File "/Users/scari/anaconda3/lib/python3.4/site-packages/pip/_vendor/pkg_resources/__init__.py", line 341, in get_provider
    return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0]
  File "/Users/scari/anaconda3/lib/python3.4/site-packages/pip/_vendor/pkg_resources/__init__.py", line 870, in require
    needed = self.resolve(parse_requirements(requirements))
  File "/Users/scari/anaconda3/lib/python3.4/site-packages/pip/_vendor/pkg_resources/__init__.py", line 740, in resolve
    env = Environment(self.entries)
  File "/Users/scari/anaconda3/lib/python3.4/site-packages/pip/_vendor/pkg_resources/__init__.py", line 927, in __init__
    self.scan(search_path)
  File "/Users/scari/anaconda3/lib/python3.4/site-packages/pip/_vendor/pkg_resources/__init__.py", line 957, in scan
    self.add(dist)
  File "/Users/scari/anaconda3/lib/python3.4/site-packages/pip/_vendor/pkg_resources/__init__.py", line 977, in add
    dists.sort(key=operator.attrgetter('hashcmp'), reverse=True)
TypeError: unorderable types: str() < NoneType() 



이렇게 되는겨... 저기서 str이랑 None을 비교하나 보다. 소스를 까본다.



970     def add(self, dist):
971         """Add `dist` if we ``can_add()`` it and it has not already been added
972         """
973         if self.can_add(dist) and dist.has_version():
974             dists = self._distmap.setdefault(dist.key, [])
975             if dist not in dists:
976                 dists.append(dist)
977                 dists.sort(key=operator.attrgetter('hashcmp'), reverse=True)


아, sort()key로 hashcmp attr를 넘기네. 그럼 hashcmp를 찾아보자.



2388     @property
2389     def hashcmp(self):
2390         return (
2391             self.parsed_version,
2392             self.precedence,
2393             self.key,
2394             _remove_md5_fragment(self.location),
2395             self.py_version,
2396             self.platform,
2397         )



아따 뭘 많이도 반환하네. 우선 반환하는 튜플을 한번 찍어볼까?
return(...)을 복사해서 return 전에 붙이고 print로 바꿔준다. 요로케. 흐흐흐



2388     @property
2389     def hashcmp(self):
2390         print (
2391             self.parsed_version,
2392             self.precedence,
2393             self.key,
2394             _remove_md5_fragment(self.location),
2395             self.py_version,
2396             self.platform,
2397         )
2398         return (
2399             self.parsed_version,
2400             self.precedence,
2401             self.key,
2402             _remove_md5_fragment(self.location),
2403             self.py_version,
2404             self.platform,
2405         )



그리고 다시 pip를 해보면? 짜잔~



scari@sylvanas:~/codes$ pip install konlpy
[snip]
0.8.1 -1 bokeh /Users/scari/anaconda3/lib/python3.4/site-packages 3.4 None
2.32.1 -1 boto /Users/scari/anaconda3/lib/python3.4/site-packages 3.4 None
1.0.0 -1 cachetools /Users/scari/anaconda3/lib/python3.4/site-packages None None
0.8.6 -1 cffi /Users/scari/anaconda3/lib/python3.4/site-packages 3.4 macosx-10.5-x86_64
0.3.3 -1 colorama /Users/scari/anaconda3/lib/python3.4/site-packages 3.4 None
[snip]

self.platformNone인 경우는 너무 흔하고, 가끔 self.py_version까지 None인 녀석들이 있다.
그랬구나. 그래서 TypeError가 났던거였구나. 내가 고쳐줄게 우쭈쭈쭈.
py_versionplatformNone인 경우에는 ''를 반환하도록 고쳐준다.



2388     @property
2389     def hashcmp(self):
2390         return (
2391             self.parsed_version,
2392             self.precedence,
2393             self.key,
2394             _remove_md5_fragment(self.location),
2395             self.py_version or '',
2396             self.platform or '',
2397         )

문제가 해결이 되었나 확인해볼까?


scari@sylvanas:~/codes$ pip install konlpy
Collecting konlpy
Downloading konlpy-0.4.3-py2.py3-none-any.whl (22.4MB)
100% |################################| 22.5MB 12kB/s
[snip]
Successfully installed JPype1-py3-0.5.5.2 konlpy-0.4.3



ㅋㅋㅋㅋㅋ 잘된다! 한 건 했으니까 PR 날려야지 룰루~


...


Aㅏ...


https://bitbucket.org/pypa/setuptools/pull-request/122/ensure-py_version-and-platform-are-str-in/diff



삽질한게 아까워서 블로그에 기록. 역시 이런 거저 먹는 꿀 버그는 먼저 밟는 사람이 임자다.
이 버그 한달만 빨리 밟았어도 setuptools에 커밋 하나 하는건데 아쉽 ㅠㅠ

P.S) 쓰고 나니 konlpy PPL 글이 되버렸다.

댓글 없음:

댓글 쓰기