Python在Cygwin上导入cx_Oracle时出现错误。

3

由于cygwin没有可用的端口,我试图从pypi源安装cx_Oracle。根据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
>>>

如果有人能帮我修复这个问题吗? 谢谢您。

我切换到另一个目录并获取以下输出:- `$ python Python 2.7.3(默认,2012年12月18日,13:50:09) [GCC 4.5.3] on cygwin 键入“help”、“copyright”、“credits”或“license”以获取更多信息。
import cx_Oracle Traceback(最近的呼叫最先):   文件“<stdin>”,第1行,在<module>中   文件“build/bdist.cygwin-1.7.24-i686/egg/cx_Oracle.py”,第7行,在<module>中   文件“build/bdist.cygwin-1.7.24-i686/egg/cx_Oracle.py”,第6行,__bootstrap__中 ImportError:执行格式错误
- ZeroGraviti
3个回答

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
>>>

我也看到了这个错误,但是我在.profile中设置了PATH、ORACLE_HOME、TNS_ADMIN和LD_LIBRARY_PATH(使用cygwin路径,安装了32位的oracle客户端)。你做了其他的更改吗?我使用的是稍微新一点的版本(Python 2.7.5,GCC 4.8.1)。我能够运行setup.py并编译(必须删除对-mno-cygwin的引用),但我无法导入模块。 - Kevin Seifert
你能提供一下当你尝试导入时控制台错误的日志吗?此外,请检查你的Oracle即时客户端的版本。还有从我对文件系统中本地更改或环境变量是否需要其他信息?同时,你可以检查必要的文件权限和文件所有者。你可以分享setup.py或任何其他你修改过的文件吗?我可以检查差异(如果有的话)... - ZeroGraviti
1
此外,请检查您是否使用Windows安装程序安装了Python,或者是否从Cygwin安装了它。我只在基于Windows的系统上安装了Cygwin Python。当然,您可以选择使用和测试virtualenv - ZeroGraviti
谢谢!我会研究这些选项。目前我是通过cygwin安装的Python...可能就是问题所在。 - Kevin Seifert
看起来问题已经解决了...我尝试了Windows版的Python :) easy_install cx_Oracle 可以用于二进制安装。pip 需要Visual Studio。 - Kevin Seifert
之前我看到了相同的错误信息“ImportError: Exec format error”。同时,使用-v选项,我看到dlopen("/usr/lib/python2.7/site-packages/cx_Oracle-5.1.3-py2.7-cygwin-1.7.30-x86_64.egg/cx_Oracle.dll", 2); /bin/python: Exec format error。(尽管我使用的是32位Oracle和32位Cygwin,但我在Windows 7 64位上...我没有尝试所有64位)。 - Kevin Seifert

0

我遇到了这个错误 "Exec format error."

对我来说,这很可能是由于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

如果您只包含原始版本或者只包含您修改过的版本,那么它是否可以正常工作?

(如果您需要频繁切换两个版本,您可能需要使用virtualenv。)


我不确定为什么修改后的版本正在被“添加”。有什么建议如何“缩减sys.path”吗?基本上,我从源文件夹/home/zerog/cx_Oracle-5.1.3构建了cx_Oracle,安装的egg位于py2.7 site-packages文件夹中。 - ZeroGraviti
我该如何将cx_Oracle从我的src文件夹(/home/zerog/cx_Oracle-5.1.3)安装到virtualenv的(e.g., /foo/bar/env/lib/python2.7/site-packages)库文件夹中? - ZeroGraviti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接