프로그래머의 일상: 험난한 python 패키징
제목처럼 거창한 건 아니지만.
웹 페이지에서 JSON web token (jwt) 를 쓸 일이 있어서 pyjwt 를 가져다 쓰기 시작했다. 근데 이걸 서비스 중인 vm들에 배포하려면 .deb 패키지로 묶어야 한다. Python 라이브러리를 .deb (간단하게) 패키징 할 때는 python-stdeb 패키지를 이용해서 간단히 묶어 버리고 있다 – 이건 기회가 되면 나중에 설명할 일이 있었으면 한다.
하지만 문제 발생:
$ python setup.py --command-packages=stdeb.command bdist_deb
...
Traceback (most recent call last):
File "setup.py", line 77, in
'jwt = jwt.__main__:main'
File "/usr/lib/python2.7/distutils/core.py", line 151, in setup
dist.run_commands()
File "/usr/lib/python2.7/distutils/dist.py", line 953, in run_commands
self.run_command(cmd)
File "/usr/lib/python2.7/distutils/dist.py", line 972, in run_command
cmd_obj.run()
File "/usr/lib/python2.7/dist-packages/stdeb/command/bdist_deb.py", line 23, in run
self.run_command('sdist_dsc')
File "/usr/lib/python2.7/distutils/cmd.py", line 326, in run_command
self.distribution.run_command(command)
File "/usr/lib/python2.7/distutils/dist.py", line 972, in run_command
cmd_obj.run()
File "/usr/lib/python2.7/dist-packages/stdeb/command/sdist_dsc.py", line 139, in run
remove_expanded_source_dir=self.remove_expanded_source_dir,
File "/usr/lib/python2.7/dist-packages/stdeb/util.py", line 1061, in build_dsc
-- %(maintainer)s %(date822)s\n"""%debinfo.__dict__)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 3: ordinal not in range(128)
문제의 원인이 좀 어이 없었는데 – 달력을 확인한다면 데미지 두 배,
- 저자 이름에 non-ascii 문자가 포함되어 있고 (저자의 이름이 José)
- stdeb 에서 문자열 치환할 때 이 처리를 하지 않고 있는 것
해당 버그는 아직 처리 중인듯.
그래서 문제를 우회할 방법이 두 가진데,
- stdeb 버그를 수정한다; 이 경우엔 저 위의 오류난 곳의
__dict__
의unicode
타입인 걸 하나 하나 찾아서encode('utf-8')
하는 것 - 문제를 부정한다 (?): 이러면 안될 것 같지만 저자 이름을 수정
일단 2로 우회했는데 – stdeb 도 우분투 패키지라 이걸 덮어쓰게 배포하기가 찜찜해서 – 외부에 배포할 일이 생기거나 하면 결국 1안으로 가야할 듯 하다. 혹은 더 복잡한 다른 패키지 .deb로 만들 때 처럼 debian 파일들을 다 만들거나.
요약 (?)
- Python 모듈을 .deb 로 변환하는 python-stdeb 패키지가 있다.
- 근데 이 패키지가 unicode 를 제대로 못 다루는 부분이 있다.
- 엄한 우회책은 있지만 매우 괴롭다. 지금 2016년인데.