Maya2018生成pyd文件

这里记录一下如何生成可以用于Maya2018的.pyd文件。至于为什么要做这个pyd文件是出于多方面考虑 不仅仅是可以加密,重要的是在进行一些性能运算的时候可以帮你提升几十上百倍的速度。这里只记录一些操作步骤,至于其中的原理细节可以按需求查询。
接下来的步骤是:(我之前实现的步骤是先用python3.6生成出来之后发现maya2018并不能调用,提示python版本不同,后来发现通用版本的python2.7和maya2018本身的python2.7也是不通用的。看样子应该是msc不能向后兼容一样。但是可以向前兼容。就是高版本的可以用低版本的)
1,

首先用python生成.pyd文件需要两个python包

distutils。
Cython。
其中distutils是自带的,而Cython需要单独安装。

2,

接下来可以通过编写setup.py文件来将.py文件编译成.pyd文件。

随便到一个非中文目录下创建setup.py文件如下:

from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize("VFX_PROP_FBX_OUT_TOOL.py"))

VFX_PROP_FBX_OUT_TOOL.py文件为你需要编译的文件,将其放到setup.py相同的目录下。
由于.pyd是c\c++的动态链接库所以编译的时候需要vcvarsall.bat文件。至于编译python文件为什么需要这个东西可以看下这里 https://devblogs.microsoft.com/python/unable-to-find-vcvarsall-bat/#comments

然后vcvarsall.bat文件可以通过安装VS2017获取,安装的时候只要这一个就行:
在这里插入图片描述
3,

当上两步准备工作做好之后,我们可以通过cmd跳转到setup.py文件的目录下执行如下命令 :

python setup.py build_ext --inplace

此时如果不出意外的话应该可以成功生成在这个目录下:
在这里插入图片描述

但是你会发现这样生成出来的其实是用的python3.6的 msc 版本 这个与maya的python2.7的msc版本不一样,又因为日常版本的python2.7跟maya2018的python2.7也不一样:
在这里插入图片描述

所以我们需要用maya的python去编译生成.pyd才能在maya2018中使用。 这里发现maya的msc版本是1900对应的VS2015,但是我之前安装的是VS2017 msc版本应该是1913 ,但也懒得在装VS2015了,这里的msc主要是在buildtool中所以可以只安装 VS2015的buildtool 可以在这里下载:https://www.microsoft.com/en-us/download/details.aspx?id=48159
下载好安装就行。

接下来我们需要编译和安装Cython到maya2018:

这里主要是参考这位仁兄的方法:https://www.cnblogs.com/ibingshan/p/10346354.html

这一步是为了让Cython的msc版本跟maya2018python的msc版本一致,这里的原理可以参考cython的文档:https://cython.readthedocs.io/en/stable/src/userguide/source_files_and_compilation.html 安装之前需要先下载Cython的源码包:Cython-0.26 之后将cython解压到非中文路径下。

然后对maya中的文件进行配置:

以下的目的都是以maya的安装目录为前缀的:

1.在 /Python 文件夹中新建一个 include 和 libs 文件夹(这两个文件夹是必须的,我是根据编译过程中的报错找到的这两个文件夹)

2.拷贝 /lib/python27.lib 到 Python/libs

3.拷贝 /include/python2.7 中所有的文件到 Python/include

编译:
在cmd中转到cython的安装目录下执行 :mayapy.exe setup.py install

如果没有报错就表示成功,运行 mayapy.exe >>> import Cython 可以检测是否安装成功。

最后我们通过maya的python来编译我们的py文件为pyd文件:

在cmd中跳转到py文件所在的目录 通过执行:mayapy.exe setup.py build_ext --inplace 这里的setup.py的编写跟上面的一样。

注意:pyd 不要引用 相关联的而不被编译成pyd 的 pyc,py 和 pyc 可以引用 pyd。init.py 不能编译成 pyd
关于 .py 中的 file 属性,虽然能编译通过,但是编译成 pyd 后,会报 “file is not defined” 的错误,所以这个要特殊处理一下,__file__属性是import 一个py 模块后产生的,所以我们可以把相关的变量定义到 init.py 中

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值