例如这样一个程序:
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找到呢?
--------------------------------------------
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不鼓励隐藏源代码。