如何发布C和python混合编程的程序

例如这样一个程序:

extern "C" {#include <python.h>}

int main(int argc,char *argv[]){Py_Initialize();if(!Py_IsInitialized()) return -1;

PyObject * pModule = NULL;PyObject * pFunc = NULL;

pModule =PyImport_ImportModule("external");if(!pModule){ printf("无法打开文件external.py!"); getchar(); return -1;}pFunc= PyObject_GetAttrString(pModule, "HelloWorld");

PyEval_CallObject(pFunc, NULL);

Py_Finalize();return 0;}

它调用了外部的external.py, 最后如何发布类混合编程的程序呢?目标是在没有安装python的机器上也可以运行,并且保证c程序可以找到python解释器和python文件的路径。

对于纯python程序的发布了解一点,可以使用py2exe。纯C程序的发布自然也没问题。只是混合起来,怎们能保证发布的程序不依赖用户环境?目前能想到的只是用py2exe先生成python的发布文件,然后手工和C程序打包,在C程序中指定要调用python文件的路径。

还有一个不理解的问题是,如果我任意设置了C程序和python解释器的相对路径,Py_Initialize能保证找到python××.dll吗?


Python.exe可以找到所有库我没有疑问,因为它的发行包自己维护者目录结构和环境变量。但是我自己写的程序,怎么知道发布后python.dll在什么路径呢?

看了一些其他支持python的程序,多是把python.dll和外部的exe放在同一个目录下,这比较容易理解,Py_Initialize会优先查找当前目录。

但是如果我发布包中,把python.dll和其相关脚本放在一个子目录(相对于exe)中,exe中要做什么动作才能保证找到它们呢?是不是需要设置一下什么环境变量?还是Py_Initialize神通广大,会遍历所有子目录?(要知道目标机器上可能压根没有python也没什么环境变量可用)

回头试试用安装工具把python.dll放到系统目录中,看看能不能自动找到。还有一个问题,如果python.dll放到windows/system32下,python自己依赖的那些lib放在哪里能被python.dll找到呢?


用以下的几个步骤:
1:把安装好的python目录下LIB子目录下的所有文件压缩为zip文件(用7Zip之类的压缩,用WINRAR压的好象不行),不压缩也可以,就把这些文件全都发布到目标文件夹下的py子文件夹下去.压缩要方便些.比如压缩为Python25_Lib.zip,压缩时不要带上LIB这个文件夹本身,只压里面的文件
2:把安装好的python目录下LIBS子目录下的所有文件,也发布到目标文件夹下的子文件夹DLLS下去
3:python25.dll发布到目标文件夹下
4:程序中对PYTHON初始化完成后,修改sys.path的值,把安装目录下的py/Python25_Lib.zip和DLLs都加入进去.
5:如果有扩展模块需要使用,比如xlrd,可以把Python25\Lib\site-packages下的xlrd整个压缩为ZIP文件(这里压缩要带上XLRD这个文件夹本身).同样发布到目标文件夹下的py子文件夹中,然后在sys.path里把py/xlrd.zip加进去.

这样发布的程序就自带了Python了.

我自己的软件BiForm就是这样处理的.如果有兴趣,可以下载一个看看. http://www.biliv

--------------------------------------------

python.dll 放置在系统目录下或者当前目录下,系统会帮你找到的。

不建议将python.dll与脚本放置在一起,还是与exe一起放置,脚本另外放置


你把你的程序理解为python.exe,需要调用python.dll和别的库


使用打包工具,象py2exe , pyinstaller之类的。


客户运行时有Python环境,主要是不想提供源代码给客户,是否可以只提供编译后的.pyc文件?可以。编译后的.pyc文件能否被反编译?安全吗?

可以被反编译。重要的东西用C写。任何东西从理论上都可以进行逆向工程,严格安全的软件不存在。只是破解成本是否合适的问题。


我尝试过几乎所有的工具,最后的选择是:WINDOWS:py2exeLINUX:frezze


文明4的做法是修改zlib的源代码实现内容加密和目录结构隐藏。然后重新编译python的zipimport模块和zlib模块。

最后用py2exe打包。


尝试过反编译, python库中自带的dis模块就可以将pyc pyo等反编译成类似汇编的操作码, 但非常容易懂。里边详细记录了你所用的各个变量名(包括局部变量), 甚至当前操作码在你源代码中所在的行号。 再加上help dir等基本工具(好像还有更高级的工具)来看你的模块中的各个全局变量,类名,以及各个类的结构,所以要还原成易读的源代码也不难。 具体可以查 库指南。另外python 的-OO编译选项可以帮你你去掉写在函数名或者类名后面的以'''xxxx'''注释的语句。如若不然,你写的这些注释别人也可以看到。从python自带的这些工具, 我觉得python不鼓励隐藏源代码。




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值