我的目标是使用Pyinstaller从使用Tkinter和cx_oracle访问数据库的简单python脚本中绑定一个exe文件。python代码是在安装了Anaconda、cx_oracle包和oracle客户端的windows机器上开发的。然后,我需要在许多目标windows机器上运行exe文件,没有、oracle或。
我在开发机器上使用Python2.7和Pyinstaller 3.1。
我在网上搜索了很长一段时间,但只找到了一个关于这方面的教程:https://mail.python.org/pipermail/tutor/2014-December/103608.html
我遵循了相同的过程,并修改了规范文件如下:
# -*- mode: python -*-
block_cipher = None
a = Analysis(['mycode.py'],
pathex=['C:\\Users\\myuser\\PycharmProjects\\mycode'],
binaries=None,
datas=None,
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries + [('oraociei11.dll','D:\ProgramFiles\Anaconda2\oraociei11.dll','BINARY')],
a.zipfiles,
a.datas,
name='mycode',
debug=False,
strip=False,
upx=True,
console=True )
包裹起作用了。代码在安装了oracle客户端的原始机器上运行。但是,在另一台没有oracle客户端的机器上,它无法运行,其错误消息如下:
Tkinter回调跟踪(最近一次调用)中的异常:文件"lib-tk\Tkinter.py",第1537行,in call File“,第152行,登录DatabaseError: DPI-1047: 64位Oracle客户端库无法加载:”找不到指定的模块“。有关帮助,请参见https://oracle.github.io/odpi/doc/installation.html#windows
现在,我非常困惑的是,安全地将python脚本中的exe与cx_oracle捆绑在一起,以便它可以在没有oracle客户端的windows机器上运行的步骤是什么?还是我“必须”在目标机器上安装oracle客户端?
我真的希望找到一个更详细的教程,比我在上面找到的旧链接更详细地将cx_oracle与pyinstaller捆绑在一起。
发布于 2017-12-02 05:00:35
cx_Oracle需要一个Oracle。你需要把它安装在目标机器上!注意错误消息中的链接:https://oracle.github.io/odpi/doc/installation.html#windows。它应该帮助您完成所有您需要做的事情,以使cx_Oracle在目标机器上工作。
发布于 2021-03-29 17:09:38
谢谢你贴出这个问题。你走在正确的道路上。您只丢失了其他.dll文件。您需要将Oracle即时客户端文件夹中的所有.dll文件添加到.spec文件中。下面是我为即时客户端做的一个例子,19.10:
a.binaries = a.binaries + [('oraociei19.dll','.\\instantclient_19_10\\oraociei19.dll','BINARY')]
+ [('orannzsbb19.dll','.\\instantclient_19_10\\orannzsbb19.dll','BINARY')]
+ [('oraocci19d.dll','.\\instantclient_19_10\\oraocci19d.dll','BINARY')]
+ [('oraocci19.dll','.\\instantclient_19_10\\oraocci19.dll','BINARY')]
+ [('oci.dll','.\\instantclient_19_10\\oci.dll','BINARY')]
+ [('ocijdbc19.dll','.\\instantclient_19_10\\ocijdbc19.dll','BINARY')]
+ [('ociw32.dll','.\\instantclient_19_10\\ociw32.dll','BINARY')]
+ [('oramysql19.dll','.\\instantclient_19_10\\oramysql19.dll','BINARY')]
+ [('oraons.dll','.\\instantclient_19_10\\oraons.dll','BINARY')]
+ [('orasql19.dll','.\\instantclient_19_10\\orasql19.dll','BINARY')]
https://stackoverflow.com/questions/47603905
复制相似问题