代码之家  ›  专栏  ›  技术社区  ›  Davide Gualano

OS X中pydev和外部库的问题

  •  4
  • Davide Gualano  · 技术社区  · 14 年前

    我已经成功地在我的Eclipse(3.5.1)中的OS X 10.6.3下安装了最新版本的pydev,并使用python 2.6.1
    我在使我安装的库工作时遇到困难。
    例如,我正在尝试使用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外壳中非常有效

    我在首选项--gt;pydev--gt;解释器--python中配置了eclipse中的interpeter,使用auto-config选项并选择找到的所有libs。

    我在这里做错什么了?

    编辑:启动

    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 回复  |  直到 13 年前
        1
  •  5
  •   Liju P Oommen    13 年前

    在Eclipse中,在pydev、解释器python(或您正在使用的环境变量)下设置以下环境变量。

    1. Oracle_Home=[您的安装路径]/InstantClient_10_2
    2. ld_library_path=$ORACLE_主页
    3. dyld_library_path=$oracle_home

    这对我很有用。

        2
  •  1
  •   JulesLt    14 年前

    不知道您是否已经修复了这个问题,但是从评论来看,您似乎在这条线上的某个地方有一个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位版本的即时客户端,但使用不同的命名目录,并通过链接控制使用哪个目录。

    如果你感到勇敢,你可以做Oracle没有做的工作,并将这两个dylib合并成一个通用的二进制文件。

    http://developer.apple.com/mac/library/technotes/tn2005/tn2137.html#TNTAG3
    
        3
  •  0
  •   stvsmth Giladd    14 年前

    我和cx-oracle和eclipse也有类似的问题:所有的东西都在终端上工作,相同 no suitable image error 在日蚀中。这绝对是一个二进制兼容性问题(对我来说,它是32位对64位)。

    Juleslt在引用 developer site . 我用了 lipo 该文档中详细介绍的选项。这非常容易。因为开发人员同时使用32位和64位安装,所以我们已经为每个安装构建了一个InstantClient(这里没有PPC机器)。

    假定的同级目录为 instantclient_32 , instantclient_64 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
    

    上面将覆盖中的相关可执行文件 即时客户端 与胖双星。一旦你做到了,建立 cx_Oracle 反对这个 instantclient 图书馆和网络电话。

    多亏了朱尔斯特…这解决了许多恼人的问题。