如何将cx_oracle与Pyinstaller

时间:2017-12-02 02:14:38

标签: python oracle pyinstaller cx-oracle

我的目标是使用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的教程,而不是上面找到的旧链接。

2 个答案:

答案 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')]

  • [('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')]