在OS X中使用PyDev和外部库进行故障

时间:2010-05-21 09:49:58

标签: python eclipse pydev

我已经在OS X 10.6.3下的Eclipse(3.5.1)中使用python 2.6.1成功安装了最新版本的PyDev 我在安装我已安装的库时遇到了麻烦 例如,我正在尝试使用cx_Oracle库,如果从使用某些文本编辑器创建的简单脚本的python interpeter调用,则该库非常有用。 但是我无法让它在Eclipse中运行:我有一小段代码:

import cx_Oracle
conn = cx_Oracle.connect(CONN_STRING)
sql = "select field from mytable"
cursor = conn.cursor()
cursor.execute(sql)
for row in cursor:
    field = row[0]
    print field

如果我从Eclipse执行它,我会收到以下错误:

import cx_Oracle
  File "build/bdist.macosx-10.6-universal/egg/cx_Oracle.py", line 7, in <module>
  File "build/bdist.macosx-10.6-universal/egg/cx_Oracle.py", line 6, in __bootstrap__
ImportError: dlopen(/Users/dave/.python-eggs/cx_Oracle-5.0.3-py2.6-macosx-10.6-universal.egg-tmp/cx_Oracle.so, 2): Library not loaded: /b/227/rdbms/lib/libclntsh.dylib.10.1
  Referenced from: /Users/dave/.python-eggs/cx_Oracle-5.0.3-py2.6-macosx-10.6-universal.egg-tmp/cx_Oracle.so
  Reason: no suitable image found.  Did find:
    /Users/dave/lib/libclntsh.dylib.10.1: mach-o, but wrong architecture

相同的代码段与python shell完美配合

我在偏好中配置了Eclipse中的interpeter - &gt; PyDev - &gt; Interpreter - Python,使用Auto Config选项并选择找到的所有库。

我在这里做错了什么?

编辑:启动

file /Users/dave/.python-eggs/cx_Oracle-5.0.3-py2.6-macosx-10.6-universal.egg-tmp/cx_Oracle.so
命令行中的

告诉我:

/Users/dave/.python-eggs/cx_Oracle-5.0.3-py2.6-macosx-10.6-universal.egg-tmp/cx_Oracle.so: Mach-O universal binary with 3 architectures
/Users/dave/.python-eggs/cx_Oracle-5.0.3-py2.6-macosx-10.6-universal.egg-tmp/cx_Oracle.so (for architecture i386):  Mach-O bundle i386
/Users/dave/.python-eggs/cx_Oracle-5.0.3-py2.6-macosx-10.6-universal.egg-tmp/cx_Oracle.so (for architecture ppc7400):   Mach-O bundle ppc
/Users/dave/.python-eggs/cx_Oracle-5.0.3-py2.6-macosx-10.6-universal.egg-tmp/cx_Oracle.so (for architecture x86_64):    Mach-O 64-bit bundle x86_64

3 个答案:

答案 0 :(得分:5)

在eclipse中,在'PyDev',Interpreter - Python(或者你正在使用的)下设置以下'环境变量'。

  1. ORACLE_HOME = [您的安装路径] / instantclient_10_2
  2. LD_LIBRARY_PATH = $ ORACLE_HOME
  3. DYLD_LIBRARY_PATH = $ ORACLE_HOME
  4. 它对我有用。

答案 1 :(得分:1)

不知道你是否已经解决了这个问题,但是根据评论,你看起来有一个32/64位问题正在进行中。

cx_Oracle.so是一个通用二进制文件,里面有PPC,32位和64位Intel版本,但是从你的评论中你对libclntsh.dylib.10.1的结果与我的不同

file libclntsh.dylib.10.1
libclntsh.dylib.10.1: Mach-O 64-bit dynamically linked shared library x86_64
如果我对32位客户端运行相同的命令(我保存在一个单独的目录中),我会得到与你相同的结果

file libclntsh.dylib.10.1
libclntsh.dylib.10.1: Mach-O dynamically linked shared library i386

我猜测从命令行运行时,它要么使用不同的路径并选择适当的libclntsh,要么运行Eclipse会导致它从命令行以相反的模式运行。

解决方案 - 从Oracle下载32位和64位版本的Instant Client,但是使用不同命名的目录,并使用链接控制使用哪一个。

如果你感到勇敢,你可以完成甲骨文未能做的工作,并将两个dylib合并为通用二进制文件。

http://developer.apple.com/mac/library/technotes/tn2005/tn2137.html#TNTAG3

答案 2 :(得分:0)

我遇到了与cx_Oracle和Eclipse类似的问题:一切都在终端中运行,在Eclipse中是no suitable image error。这绝对是一个二进制兼容性问题(对我来说,它是32-对64位)。

JulesLt在引用developer site时有解决方案。我使用了该文档中详述的lipo选项。这非常容易。由于开发人员使用32位和64位安装,我们已经为每个安装了一个即时客户端(这里没有PPC机器)。

假设instantclient_32instantclient_64instantclient_fat - 其中instantclient_fat的兄弟目录只是32位或64位目录的副本 - 以下内容应该是诀窍:

cd instantclient_32 ; for f in `ls *dylib* genezi sqlplus` ; do lipo -create $f ../instantclient_64/$f -output ../instantclient_fat/$f ; done

以上内容将使用胖二进制文件覆盖instantclient_fat中的相关可执行文件。完成此操作后,针对此cx_Oracle库构建instantclient并发送电子邮件。

感谢JulesLt ...这解决了许多恼人的问题。