============试验步骤=====
通过cython处理过的py文件,变成了动态链接库形式(windows平台下pyd扩展名,linux平台下是so扩展名),但跟通常意义的动态库有所区别(通常的动态库在python下是不能直接import使用的,而要shiy使用ctypes )
本实验是在windows平台下进行,如果在linux平台下,生成的是so文件,而不是pyd文件。
so文件也是可以直接import使用。见:https://blog.csdn.net/qq_16912257/article/details/80161112
1. 安装Cython
上网站下载 https://pypi.org/project/Cython/#files
Cython-0.29.2-cp37-cp37m-win_amd64.whl
下载后用pip指令安装,pip3 install Cython-0.29.2-cp37-cp37m-win_amd64.whl
或者直接pip3 install cython安装
2. 建立一个pyx文件(也可以直接用py文件)pyd2.pyx
#coding:utf-8
#!/usr/bin/env python
import wx #导入wx包
def showwindow():
app = wx.App() #创建应用程序对象
win = wx.Frame(None,-1,'install test') #创建窗体
btn = wx.Button(win, label = 'Button') #创建Button
win.Show() #显示窗体
app.MainLoop()
3. 建立一个setup的文件setup_pyd2.py
# -*- coding: utf-8 -*-
from distutils.core import setup
from Cython.Build import cythonize
setup(name = 'pyd2',
ext_modules = cythonize("pyd2.pyx"))
3. 编译生成c文件和pyd文件
python setup.py build 此命令在当前dos 指向目录生成 .C 文件,还会生成 build 目录,并把 pyd 和 lib 文件 生成在该目录下
辅助命令 python setup.py install
复制安装模块到 python 目录 Lib\site-packages ,此命令一般在 方式[2] 之后配合使用。不是必须执行的。查看目录:
4. 使用pyd文件
需要把pyd2.cp37-win_amd64.pyd 改成pyd2.pyd才能使用。
新建userpyd2.py来引用pyd2.pyd使用。
#!/usr/bin/python
# coding=utf-8
import pyd2
pyd2.showwindow()
===========附录=========
最近有个项目需要把web服务改成桌面软件。
我的web服务是用Python写。那么改写成桌面软件考虑还是使用Python。
Python的脚本文件是开源的,若直接发布桌面软件问题很严重。因为这是公司的产品,需要保护源码。那么要对Python代码进行混淆加密保护。
混淆代码,我准备使用pyminifier。而加密处理,就比较麻烦。
Python有py、pyc、pyw、pyo、pyd等文件格式。
其中,pyc是二进制文件。但很容易被反编译。
pyw也不行,只是隐藏命令行界面而已,可以作为入口脚本。
pyo和pyc差不多,也容易被反编译。
最后剩下pyd格式。pyd格式是D语言(C/C++综合进化版本)生成的二进制文件,实际也会是dll文件。该文件目前位置没找到可以被反编译的消息,只能被反汇编。Sublime text编辑器也是使用该格式。
Python的py文件生成pyd文件步骤如下。
1、安装Cython
可以使用pip命令安装Cython。
2、处理vcvarsall.bat
若不处理,可能会出现“Unable to find vcvarsall.bat”错误。
安装Cython之后,还需要指定vcvarsall.bat的位置。
vcvarsall.bat是VC编译Python环境的文件之一。而vcvarsall.bat需要安装VC For Python2.7。我的Python是2.7,刚好可以使用这个。至于3.x版本不知道微软更新了没有。
下载地址:VCForPython27.msi
安装成功之后,再修改设置。让Cython可以找到vcarsall.bat。此处有两种方案。
方案1:修改Python安装目录的文件设置
方案2:修改注册表
我采用方案1,亲测可用。方案2未测试,看似可用。