在Mac OS X的Eclipse中使用pyobjc导入PyDev

1 投票
1 回答
993 浏览
提问于 2025-04-16 13:16

我在Mac OS X 10.6.6上安装并配置了PyDev版本1.6.5.2011020317,运行在Eclipse里:

版本:Helios服务发布1
构建ID:20100917-0705

我使用“自动配置”来设置我的Python解释器:它正确找到了/usr/bin/python(这是Python版本2.6.1),并将一些系统文件夹添加到了PYTHONPATH中,包括/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/PyObjC。现在,这个路径是OS X中Foundation模块的正确路径,这一点可以通过命令行解释器验证:

$ python
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import Foundation
>>> Foundation.__path__
['/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/PyObjC/Foundation']

那么为什么PyDev会在这个类上抱怨“从导入中未定义的变量:NSDictionary”呢:

import Foundation

class MyClass(object):

    def __init__(self, projectPath):
        '''
        Constructor
        '''
        self.projectDict = Foundation.NSDictionary.dictionaryWithContentsOfFile_(projectPath)

而我在命令行解释器中使用这个类时没有任何问题?

更新:好的,我发现了为什么它会抱怨,原因是Foundation模块使用ScriptingBridge动态生成类——大概pydev并没有真正导入这个模块来查看里面有什么类,它只是寻找.py[c]文件。所以我的问题不应该是“为什么会这样”,而是“我该怎么解决这个问题”呢?

1 个回答

4

为什么会这样?: PyDev不支持解析PyObjC脚本桥接的元数据,因此无法查看或提取许多PyObjC类的符号。

该怎么做来解决这个问题: 在PyDev的源代码中,有几个Python脚本可以处理这个元数据的发现。这些脚本由Eclipse使用配置好的解释器来执行,返回的字符串用于配置解释器、填充自动完成列表、显示使用提示等。

与您需求相关的脚本有:

使用系统解释器调用上述脚本的示例:

% /usr/bin/python interpreterInfo.py | grep PyObjC
|/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/PyObjCINS_PATH

为一个模块生成自动完成:

>>> import pycompletion
>>> print pycompletion.GetImports('os')
@@COMPLETIONS(/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/os.py,(EX_CANTCREAT, 3),(EX_CONFIG, 3),(EX_DATAERR, 3), ....

似乎可以创建一个简单的macobjc.py库,里面有检测和读取PyObjC.bridgesupport文件的功能。可以修改PyDev脚本,让它们调用这个库,以返回这些类的有效自动完成列表。您需要将Eclipse指向本地的PyDev源代码副本,以便开发和测试您的补丁。一旦完成,您可以将其提交给上游;我相信PyDev的开发者会接受一个写得好的补丁来支持PyObjC的自动完成。

撰写回答