近日为公司写了一个自动更新网站数据的程序,本来是要在我自己的机器上运行的,但是想要可能要将程序部署到其他的机器上,双不能让别人看到程序源码(因为源码里有重要的数据库用户名与密码),所以要打包成 exe.一来可以在windows下运行,二来可以保护源码(不知道是否可以真正做到保护)
在WIN平台上,先后安装 Python2.6, py2exe, cx_Oracle, Oracle instantclient 11g。cx_Oracle要和Oracle instantclient、python的版本一致,并且 cx_Oracle 要用非 Unicode 版本的,貌似Unicode版本的cx_Oracle会出现"expecting None or a str" 错误。
首先设置 oracle instantclient:
先把 oracle instantclient 解压到了 D:/ProgramFiles/instantclient,并设置以下环境变量:
ORACLE_HOME=D:/ProgramFiles/instantclient
PATH=%PATH%;D:/ProgramFiles/instantclient
TNS_ADMIN=D:/ProgramFiles/instantclient
NLA_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
重启,使设置生效
在python的目录下写一个py2exe的安装脚本:mysetup.py,内容如下:
#mysetup.py
from distutils.core import setup
import py2exe
setup(console=[{"script":"main.py"}])
脚本中的main.py是python的入口程序
一切准备就绪,开始打包。我的程序目录是 D:/WebAutoUpdate,执行命令:python D:/WebAutoUpdate/mysetup.py py2exe,出现以下错误:
error: main.py: No such file or directory
解决办法:进入程序目录后再执行命令
继续执行命令,错误:no such file or dircetory : msvcr80.dll
解决办法:在c:/windows中搜索此文件,并将其拷贝到 python 的site-packages目录中
打包完成,在终端中执行一下程序main.exe,错误: cx_Oracle.InterfaceError: Unable to acquire Oracle environment handle
解决办法:将 oraciei11.dll, oraocci11.dll, oci.dll拷贝到生成的目录(dist)中(oci.dll可能已经在目录中),以上3个dll都可以在oracle instantclient中找到。
再执行程序,没有错误,大功告成。
在以上的打包过程中,还有两个错误,因为具体内容记不清了,所以就没有在上面写出来。一个是关于decimal的,好像是 "no module named decimal",解决办法是在 main.py中引用:import decimal,另一个一点儿印象也没有了,解决的办法是将刚提到的三个dll拷贝到 python 的 site-packages 目录中。