Maya mayapy.exe 安裝 Cython,編譯 pyd
前言
在 Python 2.7 cython cythonize py 編譯成 pyd 談談那些坑 中最后提到,使用 VCForPython27 編譯的 pyd,不能在 maya 中使用,這跟編譯 mayapy.exe 的 msc 有很大關系,運行 mayapy.exe 就能獲取 python 的版本 和 msc 的版本,至於 msc 和 VS 的版本對應,請參閱:MSC VS 版本對應
軟件安裝
maya2014
vs 2010(只要安裝就行,mayapy.exe 會自動找到 msc)
編譯和安裝 Cython 到 maya2014 的 python lib 中
這里我們需要 Cython 源碼,用 maya2014 的 python.exe 來運行 Cython 的 setup.py,這樣會自動找到 vs2010 的 msc 來編譯 Cython,這樣才會和 maya 的 python.exe 的 msc 版本一致。
下載 Cython-0.26,或者在github上下載最新的版本 https://github.com/cython/cython
編譯預准備:
在編譯前,我們需要在 maya 的安裝路徑中配置一下編譯需要的 python 頭文件和 python.lib,根據參考:maya環境下,py -> pyd,里面說的過程是對的,但是細節卻有錯誤,根據編譯中的錯誤提示,我是這樣做的:
以下的目的都是以maya的安裝目錄為前綴的:
1.在 /Python 文件夾中新建一個 include 和 libs 文件夾(這兩個文件夾是必須的,我是根據編譯過程中的報錯找到的這兩個文件夾)
2.拷貝 /lib/python27.lib 到 Python/libs
3.拷貝 /include/python2.7 中所有的文件到 Python/include
編譯
1.把下載的 cython 壓縮包解壓到任何路徑(不建議中文路徑或者一些奇葩路徑)
2.管理員運行 cmd (win 系統),因為最后會拷貝編譯好的 package 到 maya 的安裝目錄下,可能需要一些權限,尤其是如果 maya 安裝在 C 盤。
3.cd 到 解壓后的 cython 目錄下運行 "[ maya安裝目錄 ]\bin\mayapy.exe" setup.py install
4.沒有報錯就表示成功,運行 mayapy.exe >>> import Cython 可以檢測是否安裝成功
編譯 pyd
同樣,我們需要用 mayapy.exe 來運行我們的 setup.py:mayapy.exe setup.py build_ext --inplace
至於 setup.py 如何編寫,請參考 Python 2.7 cython cythonize py 編譯成 pyd 談談那些坑 中相關部分即可
編譯后的 pyd 兼容性
用 maya2014 的 cython 編譯出來的 pyd 能兼容到 maya2018,至於更高版本,可能到了使用 python3 的maya就不兼容了。
max2018 python 也兼容,可能也跟 maya 一樣,python3 的 max python 就不再兼容
官方版的 python2 也是兼容的
注意點
__init__.py 不能編譯成 pyd
關於 .py 中的 __file__ 屬性,雖然能編譯通過,但是編譯成 pyd 后,會報 "__file__ is not defined" 的錯誤,所以這個要特殊處理一下,__file__屬性是import 一個py 模塊后產生的,所以我們可以把相關的變量定義到 __init__.py 中
pyd 和 pyc 混合使用
在測試中,由於我的一個模塊中有 __file__ 屬性,所以我把 pyd 重命名,拷貝一個 pyc 到相應目錄下,發現一些 import 該模塊的模塊中的屬性不完整,所以建議:pyd 不要引用 相關聯的而不被編譯成pyd 的 pyc,py 和 pyc 可以引用 pyd