我在Eclipse中安装并配置了PyDev版本1.6.5.2011020317,在Mac OS X 10.6.6上运行:
版本:Helios Service Release 1 构建ID:20100917-0705
我使用'Auto Config'来设置我的Python解释器:它正确找到/usr/bin/python
(Python版本2.6.1)并将各种系统文件夹添加到PYTHONPATH
,包括{{1 }}。现在路径是OS X中/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/PyObjC
模块的正确路径,如命令行解释器所示:
Foundation
那么为什么PyDev在这个类上抱怨“导入的未定义变量:NSDictionary”:
$ 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']
当我可以使用该类而没有来自命令行解释器的任何问题?
更新:好的,我发现为什么它会抱怨,这是import Foundation
class MyClass(object):
def __init__(self, projectPath):
'''
Constructor
'''
self.projectDict = Foundation.NSDictionary.dictionaryWithContentsOfFile_(projectPath)
模块正在使用ScriptingBridge动态生成类 - 大概是pydev isn实际上导入模块以查看内部的类,它只是在寻找Foundation
个文件。所以,让我的问题不是“为什么会发生这种情况”,而是“我该怎么做才能解决它”?
答案 0 :(得分:3)
为什么会发生这种情况?:PyDev不支持解析PyObjC脚本桥元数据,因此无法为许多PyObjC类内省/提取符号。
如何解决此问题:在PyDev source code中,有几个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完成。