因为种种原因,有时候我们需要将py文件编译成pyd文件,但在Maya的环境下,如果是用官方的Python编译出来的pyd肯定不能用,包括PyQt,如果想在Maya环境下运行也是需要特殊编译下;下面就以Maya2016位例来演示下实现方法。

与Maya2016对应的VS是2012,具体对应版本可以查看PluginWizard里面的说明,所以需要安装VS2012,这是后面编译pyd所必需的。

编译之前的准备工作:

  1. 下载Cython源码,路径在:
    https://github.com/cython/cython
  2. 拷贝include和lib文件:
    需要将Python官方的include文件拷贝到Maya的Python文件夹里
    C:/Python27/include —> C:\Program Files\Autodesk\Maya2016\Python\include
    再将python27.lib文件拷贝到Python文件夹里
    C:/Program Files/Autodesk/Maya2016/lib/python27.lib —> C:\Program Files\Autodesk\Maya2016\Python\libs\python27.lib
  3. 安装Cython:
    将我们刚才下载的Cython源码解压出来,在cmd里切换到解压的Cython目录

    再执行如下行命令:
"C:/Program Files/Autodesk/Maya2016/bin/mayapy.exe" setup.py install

就会安装Cython了,如果整个过程没有报错则表示安装完成了

python 编译成so python编译成pyd_py


这是就在这个目录会看到多了个Cython文件夹

python 编译成so python编译成pyd_win_02


或者执行下如下命令可以测试下Cython能不能正常使用

python 编译成so python编译成pyd_py_03


看来一切都是正常的。

准备工作做完,就开始我们的编译pyd文件了,编译前需要个setup.py文件,也准备了个foo.py文件,我们就用这个foo.py文件来编译pyd,foo.py的内容很简单:

def foo():
    print('Hello world')
    print('py to pyd')

setup.py的内容:

from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize('foo.py'))

cythonize的py文件要和自己的py文件一致。

我的foo.py和setup.py都放在了桌面,所以还是用cd命令切换到桌面然后执行下面这行命令,就能生成pyd了。

"C:/Program Files/Autodesk/Maya2016/bin/mayapy.exe" setup.py build_ext --inplace

python 编译成so python编译成pyd_py_04


编译完之后会多个.c文件和build文件夹,我们只需要那个pyd就行了。

python 编译成so python编译成pyd_pyd_05


然后我们测试下这个pyd能否在Maya里正常使用,

python 编译成so python编译成pyd_py_06


到此整个编译过程就结束了,自己测试即使用Maya2016编译的pyd可以正常兼容到Maya2018;另外此编译方法未在Linux上测试,Linux编译的是.so文件了,不是这里的.pyd,这是在Windows上实现的方法。

Linux上就简单了,首先要安装python devel

yum install python-devel

然后再安装gcc

yum install gcc

到这一步就省去Win上的拷贝include文件操作,直接执行一下代码就行

'/usr/autodesk/maya2017/bin/mayapy' setup.py install

而Linux不同的是会在别的地方生成个cython,如图,这样就安装好了Cython,然后就执行编译命令

python 编译成so python编译成pyd_python 编译成so_07

'/usr/autodesk/maya2017/bin/mayapy' setup.py build_ext --inplace

这里的setup文件和Win上是一样的,最后就会生成个.so的文件,这就是我们需要的那个文件,同样测试下也是可以正常使用的。

python 编译成so python编译成pyd_py_08


Mac系统的话,自己没有试,应该都差不多,最多就是C的编译器不同。

注意:

如果py文件里带有__file__这种东西会报错的。