导入错误:没有名为Foundation的模块

24 投票
10 回答
38913 浏览
提问于 2025-04-15 15:19

我正在按照“PyObjC开发与Xcode 3.2”的接受答案中的说明进行操作。因为我没有足够的积分来评论实际问题,所以我在这里重新发布它:


这是我在Snow Leopard上让PyObjC工作的步骤:

  • 我使用Finder,点击 前往 > 连接到服务器...,然后作为访客连接到 http://svn.red-bean.com/pyobjc/trunk/pyobjc/pyobjc-xcode/

  • 接着,我在本地系统的 ~Library/Application Support/Developer/Shared/Xcode/ 目录下创建了一个名为 Xcode 的文件夹。(你可能已经有这个文件夹了,但我还没有为自己定制任何东西)。

  • 我把红豆服务器上的 File Templates 文件夹复制到我新建的Xcode文件夹里。

  • 然后把 Project Templates 文件夹复制到其他地方,比如桌面。

  • 使用终端,我导航到桌面上的临时Project Templates文件夹,并运行这个命令来“构建”模板:

$ cd ~/Desktop/Project\ Templates/

$ ./project-tool.py -k -v --template ~/Desktop/Project\ Templates/Cocoa-Python\ Application/CocoaApp.xcodeproj/TemplateInfo.plist Cocoa-Python\ Application ~/Library/Application\ Support/Developer/Shared/Xcode/Project\ Templates/Cocoa-Python\ Application


当我尝试运行以 ./project-tool.py 开头的那行时,终端显示了以下错误:

Traceback (most recent call last):  
  File "./project-tool.py", line 22, in <module>  
     from Foundation import NSDictionary  
 ImportError: No module named Foundation

我正在运行Snow Leopard,并且已经安装了Xcode 3.2.1,我读到这个模块应该已经安装并正常工作。我还了解到,你可以通过在Python命令行中运行 >>> import objc 来测试PyObjC模块是否正常工作。当我运行这个时,我得到了:

>>> import objc
Traceback (most recent call last):  
  File "<stdin>", line 1, in <module>  
ImportError: No module named objc  

有没有人能帮我解决这个错误?看起来我应该能够在我的Snow Leopard安装中自动完成所有这些,但我做不到。

10 个回答

5

这是因为PyObjC在这里:
/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/PyObjC

补充一下:
我找到了让“import objc”能工作的办法,只需要:
export PYTHONPATH="/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/"

这样做会把所有的目录添加到Python的路径中(sys.path)

31

我也遇到过同样的问题。我觉得是因为我用homebrew安装了自己的Python来进行一些实验。

因为我担心不同版本的Python会混在一起,所以我没有按照上面提到的方法创建链接,而是使用以下命令安装了一个新的pyobjc:

$ pip install pyobjc

顺便提一下,来自(http://pythonhosted.org/pyobjc/)

PyObjC项目的目标是提供一个Python和Objective-C编程语言之间的桥梁。

6

好的,经过修改mjv的回答,我发现通过输入

export PYTHONPATH="/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages/PyObjC/"

这行代码后,再执行./project-tool.py这一行,就能正常工作了。我还是觉得这样做很荒谬,如果有人能告诉我为什么要这样做,我会非常高兴。

这样做之后,

>>> import objc

这一行也能正常工作了。

撰写回答