我在这一点上有点失落。我还试图安装一个旧版本的cx_Oracle,我已经安装在一个单独的virtualenv中,但它也在同一个地方失败并出现相同的错误消息。
$ pip install cx_Oracle
(...)
cx_Oracle.c:10:17: error: oci.h: No such file or directory
cx_Oracle.c:11:18: error: orid.h: No such file or directory
cx_Oracle.c:12:16: error: xa.h: No such file or directory
error: command 'gcc' failed with exit status 1
(...)
----------------------------------------
Cleaning up...
Command /R/.virtualenv/myenv/bin/python -c "import setuptools, tokenize;__file__='/R/.virtualenv/myenv/build/cx-Oracle/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-g5eyNG-record/install-record.txt --single-version-externally-managed --compile --install-headers /R/.virtualenv/myenv/include/site/python2.7 failed with error code 1 in /R/.virtualenv/myenv/build/cx-Oracle
Traceback (most recent call last):
File "/R/.virtualenv/myenv/bin/pip", line 11, in <module>
sys.exit(main())
File "/R/.virtualenv/myenv/lib/python2.7/site-packages/pip/__init__.py", line 185, in main
return command.main(cmd_args)
File "/R/.virtualenv/myenv/lib/python2.7/site-packages/pip/basecommand.py", line 161, in main
text = '\n'.join(complete_log)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 70: ordinal not in range(128)
答案 0 :(得分:12)
即使安装了Oracle即时客户端,并设置了$ ORACLE_HOME和$ LD_LIBRARY_PATH以包含客户端的路径,我也遇到了类似的错误,尝试pip install cx_oracle。
听起来好像您可能安装了Instant Client,但没有安装Instant Client SDK。 SDK是一个单独的下载/安装,并且cx_oracle似乎需要两者,因为缺少的包括(&#39; oci.h&#39;以及所有其余的)都位于SDK中。
如果您还没有去过,可以在此处找到Oracle Instant Client / SDK下载页面:
http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html
假设您已经下载并安装了适合您平台的客户端,例如这一个:
oracle-instantclient11.2-basic-11.2.0.1.0-1.x86_64.zip
您还需要下载并安装相应的SDK,例如这一个:
oracle-instantclient11.2-sdk-11.2.0.1.0-1.x86_64.zip
只要SDK安装在ORACLE_HOME和LD_LIBRARY_PATH路径的某个位置,就应解析包含。
答案 1 :(得分:2)
问题在于SDK不存在,正如bschulz所指出的那样。我能够通过以下步骤解决问题:
在$ ORACLE_HOME中下载并安装/解压缩“instantclient-basic”和“instantclient-sdk”。
您可以从here
设置/etc/environment
export ORACLE_HOME=/opt/oracle/instantclient_12_2
export LD_LIBRARY_PATH=/opt/oracle/instantclient_12_2
cd $ORACLE_HOME
unzip /sdk/ottclasses.zip
cp -R ./sdk/* .
cp -R ./sdk/include/* .
ln -s libclntsh.so.12.1 libclntsh.so
ln -s libocci.so.12.1 libocci.so
现在运行pip install cx_Oracle==5.3
我按照这些操作成功地为我安装了5.3。
您可能需要安装一些其他依赖项,如下载/安装软件包的文档中所列。
答案 2 :(得分:1)
在Mac OS上也经历过同样的事情。
首先,我遵循了this的回答,并通过brew安装了instantclient-basic
和instantclient-sqlplus
。
然后按照同样的想法,我也downloaded SDK Package
(instantclient-sdk-macos.x64-19.3.0.0.0dbru.zip)并执行:
brew install instantclient-sdk
答案 3 :(得分:0)
正如bschulz所解释的,这个问题通常解决了设置ORACLE_HOME和LD_LIBRARY_PATH环境变量以确保gcc可以访问头文件。&#xA;在我的情况下它没有解决问题,但检查错误跟踪给了我解决问题的提示。
&#xA;&#xA;执行pip install cx_Oracle显示此错误:
&#xA;&#xA; gcc - pthread -fno-strict-aliasing -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE = 2 -fexceptions -fstack-protector --param = ssp-buffer-size = 4 -m64 -mtune = generic -D_GNU_SOURCE -fPIC - fwrapv -DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE = 2 -fexceptions -fstack-protector -param = ssp-buffer-size = 4 -m64 -mtune = generic -D_GNU_SOURCE -fPIC -fwrapv -fPIC - I / home / oracle / product / 12.1.0 / rdbms / demo -I / home / oracle / product / 12.1.0 / rdbms / public -I / usr / include / python2.7 -c cx_Oracle.c -o build / temp.linux-x86_64-2.7-12c / cx_Oracle.o -DBUILD_VERSION = 5.2.1&#xA; cx_Oracle.c:10:17:错误:oci.h:没有这样的文件或目录&#xA; cx_Oracle.c:11: 18:错误:或id.h:没有这样的文件或目录&#xA; cx_Oracle.c:27:2:错误:#error不支持的OCI版本。&#xA;
&#xA;&#xA; < p>在man中查找-I标志gcc:&#xA;&#xA; -I dir将目录dir添加到要搜索头文件的目录列表中。 ....&#xA;
&#xA;&#xA; 所以问题在于这些标志值:
&#xA;&#xA; -I / home / oracle / product / 12.1.0 / rdbms / demo&#xA; -I / home / oracle / product / 12.1.0 / rdbms / public&#xA; -I / usr / include /python2.7
我无法真正告诉为什么-I标志被设置为这些值,但是简单的方法来实现它工作是修改从pip命令行传递正确值的标志:
&#xA;&#xA; pip install cx_Oracle --global-option = build_ext --global-option =“ -I / home / oracle / instantclient_12_1 / sdk / include“&#xA;
&#xA;&#xA; 这样一个新的-I值被发送到gcc和安装结束正确。
&#XA;答案 4 :(得分:0)
来自cx_Oracle 6:
在cx_Oracle 5.2和5.3中,如果使用Instant Client RPM,则无需在安装时设置ORACLE_HOME,也不需要在运行时设置LD_LIBRARY_PATH。如果您使用Instant Client zips(或真正的DB $ ORACLE_HOME安装),则可以在安装cx_Oracle之前设置FORCE_RPATH = 1。如果这样做,则不需要在运行时设置LD_LIBRARY_PATH。这个功能在cx_Oracle中有几个版本。