読者です 読者をやめる 読者になる 読者になる

python3.3からparseまわりでなんか変わったのかな

pficommonがPython3.4でビルドできないなと思っていたのだけれど、importした時のparseが変わってコメント行にもnull byteをいれられなくなっているような気がするという話。

$ python3.3
Python 3.3.5 (default, Jun 30 2014, 12:20:12)
[GCC 4.7.3] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> __import__("unittest_gtest")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: source code string cannot contain null bytes
>>>
$ python3.2
Python 3.2.5 (default, Jul 8 2014, 10:38:55)
[GCC 4.8.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> __import__("unittest_gtest")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "unittest_gtest.py", line 38, in <module>
from waflib.TaskGen import before, after, feature
ImportError: No module named waflib.TaskGen
>>>

 

python3.3だと"TypeError: source code string cannot contain null bytes"になっているけど、python3.2だと"ImportError: No module named waflib.TaskGen"となっていることに注目。 unittest_gtest.pyはコメント行の中にnull byteがあって、普通に無視されているのならば大丈夫なんだけれど。正直なところPython本体のバグなのかもしれない。

小さくreproduceするにはたとえばfoo.pyとloader.pyを用意して

foo.py:

def foo():
    pass

# contain null byte <ここをnull byteにする>

 

loader.py:

import foo

 

実行してみるとpython3.3,python3.4では実行が通らない。

$ python3.4 loader.py
Traceback (most recent call last):
File "loader.py", line 1, in <module>
import foo
TypeError: source code string cannot contain null bytes
$ python3.3 loader.py
Traceback (most recent call last):
File "loader.py", line 1, in <module>
import foo
TypeError: source code string cannot contain null bytes
$ python3.2 loader.py
$ python2.7 loader.py

 

Changesを見てもそれっぽいのはないんだけど、Pythonのバグなのかはたまたこうすることにしたのかどうなんでしょう?教えてえろい人