关于python使用pyrex编译成可执行文件的问题
2007-06-01 20:19
836 查看
转自我在百度的blog: http://hi.baidu.com/python23/ 这个问题是相当有意义的,如果有了比较好的方法,python完全可以用来开发商业软件,而不用担心源代码泄露。
前两天我在网上看了看,有很多的人在问这个问题。大部分的人都在用py2exe,这是个对python程序打包的东东,实际上只是在python程序中找 出依赖的模块,然后发布这个程序。好处在于可以让这个程序脱离python的环境来执行,不用安装python解释器。但实际上并不能保护源代码,因为源 代码其实也包含在其中了。更好的办法是使用Pyrex。在http: //www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/可以下载到。本来Pyrex是一个用来混合 编写python和c程序的东西,然后转换为c代码,再编译成可执行文件。于是这里就相当于提供了一种方法可以将python代码转换为c代码,这样就可 以把python程序编译为真正的可执行文件了!下面说说怎么做。假设我们有一个简单的python程序,代码如下,假设文件名为 go.py
def add(a, b):
print a+b # 为了方便看到函数调用,输出一下
retur a+b
仅仅做一个简单的加法操作。那我们想把它编译为可执行文件的话,需要进行以下几步:
1.修改go.py文件,在里面添加一个c函数,当然要用Pyrex的语法,用这个函数来调用python程序的入口函数(在这里就是add了)。修改go.py为go.pyx。
在这里就是添加一个:
cdef public int c_add(int a, int b):
return add(a, b)
2.添加一个头文件 go.pxi,让主函数能找到go.py里的c函数的申明
[b]
cdef extern int (c_add(int, int))
[/b] 3.编写一个主函数文件main.c,在该主函数中包含go.h(这个文件会自动生成), 并调用前面设计的c函数。
[b]
#include <stdio.h>
#include <string.h>
#include <Python.h>
#include "go.h"
int main(int argc, char *argv[])
...{
Py_Initialize();
initgo(); // 这个地方的函数名字为init加上模块名,就是原来那个py文件的名字
c_add(2, 5);
Py_Finalize();
return 0;
}
[/b] 好了,现在编译就是:
pyrexc go.pyx
gcc go.c main.c -I/usr/include/python2.5 -L/usr/lib/ -lpython2.5 -o go
就生成了叫go的可执行文件,执行它,就得到了想要的结果!
注:此方法我只在linux上试过。
前两天我在网上看了看,有很多的人在问这个问题。大部分的人都在用py2exe,这是个对python程序打包的东东,实际上只是在python程序中找 出依赖的模块,然后发布这个程序。好处在于可以让这个程序脱离python的环境来执行,不用安装python解释器。但实际上并不能保护源代码,因为源 代码其实也包含在其中了。更好的办法是使用Pyrex。在http: //www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/可以下载到。本来Pyrex是一个用来混合 编写python和c程序的东西,然后转换为c代码,再编译成可执行文件。于是这里就相当于提供了一种方法可以将python代码转换为c代码,这样就可 以把python程序编译为真正的可执行文件了!下面说说怎么做。假设我们有一个简单的python程序,代码如下,假设文件名为 go.py
def add(a, b):
print a+b # 为了方便看到函数调用,输出一下
retur a+b
仅仅做一个简单的加法操作。那我们想把它编译为可执行文件的话,需要进行以下几步:
1.修改go.py文件,在里面添加一个c函数,当然要用Pyrex的语法,用这个函数来调用python程序的入口函数(在这里就是add了)。修改go.py为go.pyx。
在这里就是添加一个:
cdef public int c_add(int a, int b):
return add(a, b)
2.添加一个头文件 go.pxi,让主函数能找到go.py里的c函数的申明
[b]
cdef extern int (c_add(int, int))
[/b] 3.编写一个主函数文件main.c,在该主函数中包含go.h(这个文件会自动生成), 并调用前面设计的c函数。
[b]
#include <stdio.h>
#include <string.h>
#include <Python.h>
#include "go.h"
int main(int argc, char *argv[])
...{
Py_Initialize();
initgo(); // 这个地方的函数名字为init加上模块名,就是原来那个py文件的名字
c_add(2, 5);
Py_Finalize();
return 0;
}
[/b] 好了,现在编译就是:
pyrexc go.pyx
gcc go.c main.c -I/usr/include/python2.5 -L/usr/lib/ -lpython2.5 -o go
就生成了叫go的可执行文件,执行它,就得到了想要的结果!
注:此方法我只在linux上试过。
相关文章推荐
- 关于编译执行文件遇到的问题小结
- 使用py2exe将python文件.py编译成可以执行文件.exe
- 关于python中将py文件转换成exe文件的问题(使用py2exe)
- Android 关于NDK Clang3.4 编译可执行文件无法启动的问题
- Python 中使用 pyrex 生成 Linux 可执行文件
- 使用 cx_freeze 把python程序编译成可执行文件
- Python读取UTF-8编码文件并使用命令行执行时输出结果的问题
- 使用PyInstaller将python转成可执行文件exe笔记
- matlab文件编译成库在C++环境下使用遇到的问题记录
- 使用make编译android项目时,修改了文件xml文件名称,导致编译出错的问题原因
- 关于使用aidl中的接口但编译却找不到类的问题
- Python 出现需要使用fPIC重新编译的问题
- 关于python编译时出现的问题
- Linux下gcc编译中关于头文件与库文件搜索路径相关问题(一)
- 关于使用SHFileOperation做文件操作的问题
- 使用uncompyle2直接反编译python字节码文件pyo/pyc
- 【selenium】python+selenium+unittest,关于每次执行完一个测试用例都关闭浏览器等时间较长的问题之解决方案
- 关于stl中transfrom使用时编译错误问题
- 使用PyInstaller2将Python脚本转化为可执行文件(中-使用部分)
- windows下使用cx_freeze将Python程序打包成exe可执行文件