在Cygwin上导入cx_Oracle的Python错误
我尝试从pypi源安装cx_Oracle,因为在cygwin中没有可用的安装包。我按照这个链接中的建议做了一些修改:http://permalink.gmane.org/gmane.comp.python.db.cx-oracle/2492,并修改了我的setup.py文件。但是,我仍然遇到了以下错误:
$ python
Python 2.7.3 (default, Dec 18 2012, 13:50:09)
[GCC 4.5.3] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cx_Oracle
/usr/lib/python2.7/site-packages/cx_Oracle-5.1.3-py2.7-cygwin-1.7.24-i686.egg/cx_Oracle.py:3: UserWa
rning: Module cx_Oracle was already imported from /usr/lib/python2.7/site-packages/cx_Oracle-5.1.3-p
y2.7-cygwin-1.7.24-i686.egg/cx_Oracle.pyc, but /home/zerog/cx_Oracle-5.1.3 is being added to sys.pat
h
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "build/bdist.cygwin-1.7.24-i686/egg/cx_Oracle.py", line 7, in <module>
File "build/bdist.cygwin-1.7.24-i686/egg/cx_Oracle.py", line 6, in __bootstrap__
ImportError: Exec format error
>>>
有没有人能帮我解决这个问题呢?
谢谢大家。
相关问题:
3 个回答
我遇到了一个错误,提示“执行格式错误”。
对我来说,这个问题可能是因为我安装的cygwin是64位的,而即时客户端却是32位的。你需要确认一下所有的东西(比如oracle和cygwin)都是32位或者64位的一致。
解决我问题的方法:
因为我的cygwin是64位的(可以通过运行
uname -a来查看,找一下x86_64),所以我从oracle的网站上下载了64位的即时客户端,并解压了它。我在.profile文件中设置了环境变量,指向解压后的文件夹:
export ORACLE_HOME=/cygdrive/c/oracle/instantclient_x64_11_2
export LD_LIBRARY_PATH=$ORACLE_HOME
export DYLD_LIBRARY_PATH=$ORACLE_HOME
export TNS_ADMIN='//optional/path/to/your/oracle/tns/files/'
运行命令
source ~/.profile来使这些设置生效。为了测试,现在你应该可以运行这个python命令而不会出错:
import cx_Oracle
要确认路径是否正确,你可以运行ls命令,应该能看到类似的内容:
ls $ORACLE_HOME
adrci.exe genezi.exe oci.sym ociw32.dll ojdbc6.jar
oraocci11.dll oraociei11.sym uidrvci.exe vc9
adrci.sym genezi.sym ocijdbc11.dll ociw32.sym orannzsbb11.dll
oraocci11.sym orasql11.dll uidrvci.sym xstreams.jar
BASIC_README oci.dll ocijdbc11.sym ojdbc5.jar orannzsbb11.sym
oraociei11.dll orasql11.sym vc8
从错误信息来看,很难确定具体问题,但我猜你的 sys.path 中有 cx_Oracle 的 两个 不同版本。错误信息提示说同一个模块的不同版本已经被 import 过了。
可以推测,原始的版本是安装在系统的 /usr/lib/python2.7/site-packages/cx_Oracle-5.1.3-py2.7-cygwin-1.7.24-i686.egg 目录下,而你修改过的版本则在 /home/zerog/cx_Oracle-5.1.3 目录中。
如果你把 sys.path 简化,只保留原始版本或者只保留你修改过的版本,这样能正常工作吗?
(如果你需要频繁在两个版本之间切换,可以考虑使用 virtualenv。)
通过下面的方式指定instantclient的路径,解决了这个问题:
$ export PATH=$PATH:/cygdrive/d/Tools/instantclient_11_2
(还有其他可能重要的内容):
$ echo $LD_LIBRARY_PATH
/cygdrive/d/Tools/instantclient_11_2
$ echo $ORACLE_HOME
/cygdrive/d/Tools/instantclient_11_2
现在,我得到了:
$ python
Python 2.7.3 (default, Dec 18 2012, 13:50:09)
[GCC 4.5.3] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cx_Oracle
>>>