python连接oracle数据库需要import cx_oracle,安装引入的坑就先不写了,主要记一下通过pyinstaller打包成exe的坑。
我通过pyinstaller -F -w Insert.py打包生成exe后,在本机运行正常,但是拷贝到其他电脑,就报错。由于上周解决的,现在才来写,有些环节记不清了,报错也有过几种情况。
Traceback (most recent call last):
File "Insert.py", line 12, in
ImportError: DLL load failed: 找不到指定的模块。
[7672] Failed to execute script 'Insert' due to unhandledexception!
还有cx_Oracle.InterfaceError: Unable to acquire Oracle environment handle的报错
网上百度了好几天,最后通过下面方法解决。
首先,拷贝到的新电脑,需要安装visoal运行库,网上下载安装一下。我是用了同事给的个VisualCppRedist_AIO_x86_x64_v55.rar。
Oracle Instant Client libraries需要VC环境,并匹配对应的位数和版本,对应关系如下:
For Instant Client 18 or 12.2 install VS 2013
For Instant Client 12.1 install VS 2010
For Instant Client 11.2 install VS 2005 64-bit or VS 2005 32-bit
然后就是pyinstaller看起来并不会将动态链接库自动打包,所以我们需要告诉pyinstaller要打包哪些动态链接库,步骤如下(假设python文件名为 Insert.py):
1. 使用pyinstaller -F Insert.py 打包后会生成一个 Insert.spec文件,我们要修改这个spec文件。
将 a.binaries, 改为
a.binaries+[('oraociei12.dll','D:\\app\\client\\Administrator\\product\\12.2.0\\client_1\\instantclient\\oraociei12.dll','BINARY'),('oci.dll','D:\\app\\client\\Administrator\\product\\12.2.0\\client_1\\bin\\oci.dll','BINARY'),('oraons.dll','D:\\app\\client\\Administrator\\product\\12.2.0\\client_1\\bin\\oraons.dll','BINARY')],
以上路径需要参照oracle instantclient、bin目录中各文件的路径进行修改。
2. 依照spec文件打包,执行命令如下:
pyinstaller -F Insert.spec
我用的是pyinstaller -D Insert.spec命令,感觉应该差不多。但是运行后除了界面还会带个黑框,这个修改一下Insert.spec文件中的
console值,修改为console=False。
我是通过以上步骤成功打包出程序,然后拷贝到新的电脑后可以运行。今天写可能记不了那么清楚,如果有不当的地方,请见谅。
参考链接:https://www.cnblogs.com/vanwoos/p/12020727.html
https://blog.csdn.net/cuidai4743/article/details/100332152