将Maya的python代码编译成pyd

zhangly 2021-12-20 14:08:14
Categories: > Tags:

关于将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-py-to-pyd-p2.jpg
或者在Maya的script editor里:

maya-py-to-pyd-p5.jpg
可以看到,Maya2018使用的是MSC v.1900版本,通过下表来找到对应的VS版本。

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.1916 -> Visual C++ 2017 (15.9)

对应的版本是Visual C++ 2015,在官网上进行下载安装。
也可以到https://msdn.itellyou.cn/进行下载。
(推荐后者,微软官网的下载体验巨差)

maya-py-to-pyd-p3.jpg
下载完成后安装,记得勾选

maya-py-to-pyd-p4.png

2.安装Cython

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

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

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

maya-py-to-pyd-p6.png

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

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

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

3.编译成pyd文件

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

# 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到你的代码文件夹,运行:

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