Maya2020でtypingを自前で読み込むと死ぬ問題に対する対応
Maya2020でtypingモジュールを自前で読み込んでたりすると、例えば以下のようなコードを実行したとき
code:test.py
from collections import OrderedDict
try:
_COLORS = OrderedDict([
("red", (1, 0, 0)),
("green", (0, 1, 0)),
("blue", (0, 0, 1))
])
except Exception as e:
import traceback
print(traceback.format_exc())
code:result
Traceback (most recent call last):
File "<maya console>", line 15, in <module>
File "C:\Program Files\Autodesk\Maya2020\bin\python27.zip\collections.py", line 57, in __init__
self.__update(*args, **kwds)
File "C:\Program Files\Autodesk\Maya2020\bin\python27.zip\_abcoll.py", line 564, in update
if isinstance(other, Mapping):
File "C:\Program Files\Autodesk\Maya2020\bin\python27.zip\abc.py", line 144, in __instancecheck__
(略)
File "C:\Users\XXX\Documents\test\vendor\typing.py", line 1140, in __extrahook__
if issubclass(subclass, scls):
File "C:\Program Files\Autodesk\Maya2020\Python\lib\site-packages\shiboken2\files.dir\shibokensupport\typing27.py", line 1338, in __subclasscheck__
return super(GenericMeta, self).__subclasscheck__(cls)
File "C:\Program Files\Autodesk\Maya2020\bin\python27.zip\abc.py", line 161, in __subclasscheck__
ok = cls.__subclasshook__(subclass)
File "C:\Program Files\Autodesk\Maya2020\Python\lib\site-packages\shiboken2\files.dir\shibokensupport\typing27.py", line 1070, in __extrahook__
if issubclass(subclass, scls):
File "C:\Program Files\Autodesk\Maya2020\bin\python27.zip\abc.py", line 151, in __subclasscheck__
if subclass in cls._abc_cache:
RuntimeError: maximum recursion depth exceeded
こんな感じでお亡くなりになる。
というわけでログを眺めてみると、読み込んでるtyping以外に「shibokensupport\typing27.py」ってやつが目に入ります。
多分ここに書いてあるtypingのインスタンスが複数あると死ぬよってやつに引っかかってる感じだと思われる。
Python3.7では直ってる風のことが書いてあるけど、我々はPython2.7しか使えない呪いにかかってるのでその方向は諦めます。
というわけでMaya2020でtypingを使いたいならshibokensupport.typing27があればそっちを使うようなコードを書く必要がありそう。
とはいえtyping使う全コードにそんなの書くのはダルすぎるので、今回は自前で追加しているtypingを書き換えて対応しました。
code:typing.py
try:
from shibokensupport.typing27 import *
except:
(略。本来のtypingのコードを記述)
問題なく動きました。やったね。やったね?