【问题标题】:Python cx_Oracle in HerokuHeroku 中的 Python cx_Oracle
【发布时间】:2016-09-13 23:46:20
【问题描述】:

我为此苦苦挣扎了一个星期。我正在尝试运行一个 python 烧瓶应用程序,该应用程序使用即时客户端版本 11.2.0.3.0 与远程 Oracle 数据库连接。

在遇到很多问题后,我最终使用了 3 个 buildpack,其中两个我需要自定义,然后我可以在 Heroku 中安装 cx_Oracle,但是当我运行代码时出现错误:

import cx_Oracle
ImportError: libaio.so.1: cannot open shared object file: No such file or directory

嗯,这个错误有据可查,所以我只需要这样做:

$ apt-get install libaio1 libaio-dev

但问题是如何在 Heroku 应用程序中运行 apt-get?使用第三个 buildpack:

github.com/heroku/heroku-buildpack-apt

其他构建包:

github.com/Maethorin/oracle-heroku-buildpack
github.com/Maethorin/heroku-buildpack-python

配置完所有内容后,我运行了 Heroku 部署并在执行时遇到了相同的错误。我可以在 Heroku 部署日志中看到 heroku-buildpack-apt 完成了它的工作,但我在 import cx_Oracle 中遇到了同样的错误。顺便说一句,为了确定,我更改了我正在使用的分叉 python buildpack,在每次部署时执行pip uninstall cx_Oracle,这样我就可以拥有一个新编译的版本。

在这一点上,伟大的互联网已经无法帮助我了。无论在哪里,我都可以选择安装 libaio。我试图在 Heroku App 中搜索有关使用 apt-get 的信息,但一切都指向 heroku-buildpack-apt

我认为问题可能是cx_Oracle找不到安装的libaio,我设置了很多Heroku App环境变量:

$ heroku config:set ORACLE_HOME=/app/vendor/oracle_instantclient/instantclient_11_2
$ heroku config:set LD_LIBRARY_PATH=/app/.apt/usr/lib/x86_64-linux-gnu:/app/vendor/oracle_instantclient/instantclient_11_2:/app/vendor/oracle_instantclient/instantclient_11_2/sdk:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib:/lib
$ heroku config:set LIBRARY_PATH=/app/.apt/usr/lib/x86_64-linux-gnu:/app/vendor/oracle_instantclient/instantclient_11_2:/app/vendor/oracle_instantclient/instantclient_11_2/sdk:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib:/lib
$ heroku config:set INCLUDE_PATH=/app/.apt/usr/include
$ heroku config:set PATH=/bin:/sbin:/usr/bin:/app/.apt/usr/bin
$ heroku config:set PKG_CONFIG_PATH=/app/.apt/usr/lib/x86_64-linux-gnu/pkgconfig
$ heroku config:set CPPPATH=/app/.apt/usr/include
$ heroku config:set CPATH=/app/.apt/usr/include

编辑:我忘了提这个:

当我在应该安装 libaio 的地方运行 heroku run ls -la /app/.apt/usr/lib/x86_64-linux-gnu 时,我得到了这个:

drwx------ 3 u32473 dyno  4096 Dec 21  2013 .
drwx------ 3 u32473 dyno  4096 Dec 21  2013 ..
-rw------- 1 u32473 dyno 16160 May  9  2013 libaio.a
lrwxrwxrwx 1 u32473 dyno    37 May  9  2013 libaio.so -> /lib/x86_64-linux-gnu/libaio.so.1.0.1
drwx------ 2 u32473 dyno  4096 May 17 16:57 pkgconfig

但是当我运行heroku run ls -l /lib/x86_64-linux-gnu/libaio.so.1.0.1 时,那里没有文件。所以真正的问题是 libaio 安装在哪里?

谁能帮我完成这项工作?或者 cx_Oracle 还有什么好的替代品?

谢谢!

【问题讨论】:

  • 您是否能够验证 libaio 是否已实际安装到您的 LD_LIBRAY_PATH 中的某个目录中?
  • 我忘了说...我将编辑我的问题... ty

标签: python oracle heroku


【解决方案1】:

我也遇到了同样的问题,经过一番努力后解决了。我在这里分享托管连接外部 Oracle 数据库的 python 烧瓶应用程序的步骤:

  • cd {ProjectDir}
  • pip install cx_Oracle
  • pip install gunicorn
  • 制作名为 Procfile 的文件并在其中放入以下内容: web: gunicorn yourapp:app --log-file=- //yourapp 是您的烧瓶 python 文件
  • 点冻结> requirements.txt
  • git 初始化
  • 创建heroku
  • heroku buildpacks:添加 heroku/python
  • heroku 构建包:添加 https://github.com/featurist/oracle-client-buildpack
  • heroku buildpacks:添加https://github.com/heroku/heroku-buildpack-apt
  • heroku config:set BUILD_WITH_GEO_LIBRARIES=1 //这是用于 shapely python 包 (可选)
  • 创建名为 Aptfile 的文件并将 libaio1 放入其中
  • git push heroku master

【讨论】:

    【解决方案2】:

    我解决了这个...问题确实是libaio.so的位置。

    我开始寻找可以安装此库的所有可能位置。我在/app/.apt/lib/x86_64-linux-gnu 中找到它,而不是在/app/.apt/usr/lib/x86_64-linux-gnu 中找到它,heroku-buildpack-apt 认为它已安装,也没有在任何系统 lib 文件夹中。

    所以我在LD_LIBRARY_PATH 中添加了这条路径,一切正常!

    大家好!!!

    【讨论】:

      【解决方案3】:

      设置 DYLD_LIBRARY_PATH=$ORACLE_HOME 和 LD_LIBRARY_PATH=$ORACLE_HOME 并重试

      【讨论】:

      • LD_LIBRARY_PATH 已被设置。而且 DYLD_LIBRARY_PATH 只被 OS X 使用,不是吗?
      • 是的,这仅适用于 MAC OS,适用于 LD_LIBRARY_PATH 的 linux
      • 我也已经设置了 ORACLE_HOME:heroku config:set ORACLE_HOME=/app/vendor/oracle_instantclient/instantclient_11_2 将此添加到问题中。
      • 将环境变量设置为 Oracle 目录并不能帮助解决对系统 libaio 库的依赖。
      猜你喜欢
      • 2015-01-10
      • 2017-02-16
      • 1970-01-01
      • 1970-01-01
      • 2014-04-23
      • 2011-05-17
      • 2013-12-29
      • 2012-06-30
      • 2017-12-10
      相关资源
      最近更新 更多