我的目标是使用Pyinstaller从一个简单的python脚本捆绑exe文件,该脚本使用Tkinter和cx_oracle来访问数据库。 python代码是在安装了Anaconda,cx_oracle包和oracle客户端的Windows机器上开发的。然后我需要在许多目标Windows机器 中运行exe文件而不用 oracle客户端或Python。
我在开发机器上使用Python 2.7和Pyinstaller 3.1。
我在线搜索了很长时间,但只发现了一个教程: https://mail.python.org/pipermail/tutor/2014-December/103608.html
我按照相同的步骤修改了spec文件,如下所示:
# -*- 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回调中的异常 Traceback(最近一次调用最后一次): 文件" lib-tk \ Tkinter.py",第1537行,通话 文件"",第152行,登录 DatabaseError:DPI-1047:无法加载64位Oracle客户端库:"找不到指定的模块"。请参阅https://oracle.github.io/odpi/doc/installation.html#windows获取帮助
现在我很困惑从cx_oracle安全捆绑python脚本的exe所需的步骤是什么,以便它可以在没有oracle客户端的Windows机器上运行?或者我是否必须"在目标机器上安装oracle客户端?
我真的希望找到一个更详细的关于使用pyinstaller捆绑cx_oracle的教程,而不是上面找到的旧链接。
答案 0 :(得分:2)
cx_Oracle需要Oracle客户端。您将需要在目标计算机上安装它!请注意错误消息中的链接:https://oracle.github.io/odpi/doc/installation.html#windows。它应该帮助您完成使cx_Oracle在目标计算机上运行所需的一切。
答案 1 :(得分:1)
感谢您发布此问题。你走在正确的道路上。您只缺少其他 .dll 文件。您需要将在 Oracle 即时客户端文件夹中找到的所有 .dll 文件添加到 .spec 文件中。请参阅下面的示例,了解我为即时客户端 19.10 所做的示例:
a.binaries = a.binaries + [('oraociei19.dll','.\instantclient_19_10\oraociei19.dll','BINARY')]