在Cygwin上导入cx_Oracle的Python错误

3 投票
3 回答
2204 浏览
提问于 2025-04-18 10:18

我尝试从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 个回答

0

我遇到了一个错误,提示“执行格式错误”。

对我来说,这个问题可能是因为我安装的cygwin是64位的,而即时客户端却是32位的。你需要确认一下所有的东西(比如oracle和cygwin)都是32位或者64位的一致。

解决我问题的方法:

  1. 因为我的cygwin是64位的(可以通过运行uname -a来查看,找一下x86_64),所以我从oracle的网站上下载了64位的即时客户端,并解压了它。

  2. 我在.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/'

  3. 运行命令source ~/.profile来使这些设置生效。

  4. 为了测试,现在你应该可以运行这个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
0

从错误信息来看,很难确定具体问题,但我猜你的 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。)

1

通过下面的方式指定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
>>>

撰写回答