将Maya的python代码编译成pyd

关于将py文件编译为pyd

当你想把一个python脚本分享出去,又不想暴露源码的时候,可以将py文件编译成pyd或pyc文件。

pyd格式是D语言(C/C++综合进化版本)生成的二进制文件,实际也会是dll文件。
该文件不可以被反编译,只能被反汇编。

而pyc文件,虽然也是py编译后的格式,但是pyc非常容易被反编译,基本上可以说编译了个寂寞。

我之前用过angelic47大佬写的pyprotect,这是个第三方python加密混淆工具,编译后的pyc代码也具有很高的反编译难度。(其实我自身更偏向于pyc文件,不用像pyd一样太考虑解释器版本和系统平台)

不过后来pyprotect工具无法使用了,这也是我开始使用pyd格式进行编译的原因。
废话到这里,下面开始说下整个编译过程。(这里以Maya2018为例)

1.找到MSC版本和对应VS版本

msc是微软的C编译器,安装对应的VS版本会带有。

如何查看MSC版本,这里有两种方式:

使用cmd命令行工具,打开C:\Program Files\Autodesk\Maya2018\bin\mayapy.exe

或者在Maya的script editor里:

可以看到,Maya2018使用的是MSC v.1900版本,通过下表来找到对应的VS版本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
MSC v.1000 -> Visual C++ 4.x        
MSC v.1100 -> Visual C++ 5
MSC v.1200 -> Visual C++ 6
MSC v.1300 -> Visual C++ .NET
MSC v.1310 -> Visual C++ .NET 2003
MSC v.1400 -> Visual C++ 2005 (8.0)
MSC v.1500 -> Visual C++ 2008 (9.0)
MSC v.1600 -> Visual C++ 2010 (10.0)
MSC v.1700 -> Visual C++ 2012 (11.0)
MSC v.1800 -> Visual C++ 2013 (12.0)
MSC v.1900 -> Visual C++ 2015 (14.0)
MSC v.1910 -> Visual C++ 2017 (15.0)
MSC v.1911 -> Visual C++ 2017 (15.3)
MSC v.1912 -> Visual C++ 2017 (15.5)
MSC v.1913 -> Visual C++ 2017 (15.6)
MSC v.1914 -> Visual C++ 2017 (15.7)
MSC v.1915 -> Visual C++ 2017 (15.8)
MSC v.1910 1916 -> Visual C++ 2017 (15.9)
MSC v.1920 1929 -> Visual C++ 2019 (16.0)
MSC v.1930 -> Visual C++ 2022 (17.0)

对应的版本是Visual C++ 2015,在官网上进行下载安装。
也可以到https://msdn.itellyou.cn/进行下载。

(推荐后者,微软官网的下载体验巨差)

下载完成后安装,记得勾选

2.安装Cython

刚刚安装的是编译时所需的依赖,而我们要使用Cython将py文件编译成pyd。

https://github.com/cython/cython下载源代码进行编译安装,或者到我的网盘分享链接进行下载。
下载完解压后,先放一边。

在此之前需要在C:\Program Files\Autodesk\Maya2018\Python下新建两个文件,includelibs

  • 拷贝C:\Program Files\Autodesk\Maya2018\lib里的python27.lib文件到C:\Program Files\Autodesk\Maya2018\Python\libs
  • 拷贝C:\Program Files\Autodesk\Maya2018\include\python2.7里的所有文件到C:\Program Files\Autodesk\Maya2018\Python\include

然后用管理员模式打开cmd命令行工具,cd定位到刚刚解压的cython文件夹下。
运行:

1
"C:\Program Files\Autodesk\Maya2018\bin\mayapy.exe"  setup.py install

安装完成后就可以开始编译代码了。

3.编译成pyd文件

在你的代码中,写一个setup.py文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# coding=utf-8
#!/usr/bin/python2

import os
from distutils.core import setup
from Cython.Build import cythonize
from distutils.extension import Extension


extensions = []

for f in os.listdir(os.getcwd()):
name, ext = os.path.splitext(f)
if name == '__init__': # __init__文件不能被编译,会发生错误
continue
if ext == '.py':
extensions.append(Extension(name, ['{0}'.format(f)]))


setup(
ext_modules=cythonize(extensions)
)

打开cmd命令行工具,cd到你的代码文件夹,运行:

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