kngenieの日記

日記だ。でもさすがに毎日は書けない。

PEX作成中に死ぬ

pexの実行中/tmpに展開したディストリビューションパッケージを読もうとしてPermission deniedで死ぬ。前は普通に動いていたのだが...

```
Traceback (most recent call last):
File "/usr/lib/python2.7/atexit.py", line 24, in _run_exitfuncs
func(*targs, **kargs)
File "/home/kenji/.pyenv-xenial/versions/cdx_writer/local/lib/python2.7/site-p
ackages/pex/common.py", line 75, in teardown
self._rmtree(td)
File "/usr/lib/python2.7/shutil.py", line 247, in rmtree
rmtree(fullname, ignore_errors, onerror)
File "/usr/lib/python2.7/shutil.py", line 239, in rmtree
onerror(os.listdir, path, sys.exc_info())
File "/usr/lib/python2.7/shutil.py", line 237, in rmtree
names = os.listdir(path)
OSError: [Errno 13] Permission denied: '/tmp/tmp5m9J2E/warctools-cdx-writer'
```

調べた結果これは2018-07-23に 
Issue 15795: Zipfile.extractall does not preserve file permissions - Python tracker への対処として追加されたコードが原因。
zipからpermission bitsを読み取って展開したファイルに反映しようとしているのだが、`external_attr`に正しい値が入っていることを前提にしている。

あろうことか、githubから`archive/.zip`でダウンロードしたzipは`external_attr`のpermission bitsが基本ゼロになっており、それをそのまま使ってchmodするものだから、ディレクトリにアクセスできなくなる。
どっちが悪いとも言いにくいが、pex側で対処するのが望ましい、のだろう。

とりあえずgithubからの直接ダウンロードをやめる方向で対処する。