在OS X上用Python导入gtk时出错

0 投票
1 回答
6138 浏览
提问于 2025-04-17 19:10

我刚通过Homebrew(一个很棒的工具)安装了pygtk和它的一些依赖项(包括gtk+)。问题是,当我在Python解释器中尝试导入gtk时,它出现了一个ImportError错误,而导入pygtk或其他模块时没有这个问题。我搞不清楚哪里出了错。:S

1 个回答

1

在原作者澄清后,之前的回答并没有描述他的问题……虽然我觉得这可能相关,并且可能对其他人有帮助,所以我会保留它。但首先,先说一下相关的部分。

在你可以使用 import gtk 之前,你需要先调用 pygtk.require,就像教程的 入门指南 部分所示。(更多细节请查看 PyGTK 常见问题。)

这样应该能解决你的问题……但你却遇到了 Fatal Python error: PyThreadState_Get: no current thread 的崩溃。这种情况可能有很多原因,但在这种情况下,最可能的原因是你在用一个版本的 Python 运行一个为另一个版本构建的 C 扩展(pygtk/gtk/等等)。(这实际上在 PyGTK 常见问题 中也有提到,但在这里这是一个更普遍的问题,涉及 CPython 的 C 扩展模块,而不是 PyGTK 特有的问题。)

如果你有多个 Python 2.7 的版本(如果你有 2.7.3,那你肯定有两个,因为苹果的版本是 2.7.2),你需要弄清楚你有哪个版本,以及你用哪个版本构建了 pygtk,并确保你从同一个版本中使用它。

这就把我们带回到原来的回答,我把它留在下面。


你可能会遇到这个问题有两个原因。


首先,如果你没有安装任何额外的 Python 版本,除了 OS X 自带的版本,你可能没有阅读 brew 在安装 pygtk 时打印的说明,或者在获取信息时等等:

例如:

$ brew info pygtk
pygtk: stable 2.24.0
...
==> Caveats
For non-Homebrew Python, you need to amend your PYTHONPATH like so:
  export PYTHONPATH=/usr/local/lib/python2.7/site-packages:$PYTHONPATH

Homebrew 会把 Python 包安装到 /usr/local/lib/pythonX.Y 目录下——即使它是为苹果的 Python 安装的。但苹果的 Python 安装默认并不会在这个目录下查找包。所以,你需要按照这个说明去做。

在终端中输入这一行就能在该终端会话中生效。如果你想让它永久生效……那么,有很多选项,具体取决于你想要什么。详情请见 这个回答

这在 Gems, Eggs and Perl ModulesHomebrew 和 Python 中有更详细的解释。

(这也是 Homebrew 通常推荐尽量使用 pip 的多个原因之一,而不是在 brew 中寻找包。但也有一些例外,我很容易相信 pygtk 是其中之一。)


第二,如果你安装了 Homebrew 的 Python,你可能没有正确设置你的 PATH,这样你就把包安装到了 Homebrew Python 的 site packages 中,但却在运行苹果的 Python 安装。

如果你只是输入 python 而不知道你在运行哪个版本,输入 which python 应该能告诉你。如果是 /usr/bin/python,那就是苹果的;如果是 /usr/local/bin/python,那就是 Homebrew 的。

你也可以通过 Python 启动时的横幅来判断,因为 Mountain Lion 自带的是 2.7.2,而 Homebrew 会安装 2.7.3。(另外,我记得苹果用的是预发布版本的 clang 来构建他们的 Python,而你用 Homebrew 构建的任何东西都会用你拥有的 clang/gcc/llvm-gcc,这不会是预发布版本……)

注意:仅仅因为你在横幅中看到“Apple”这个词,并不意味着这是苹果的 Python! 如果你构建了 Homebrew 的 Python,或者安装了 python.org 的 Python,它几乎肯定是用苹果的 GCC、苹果的 Clang 或苹果的 LLVM-GCC 构建的。而且它也在苹果的操作系统上运行。所以,“Apple”或“apple”这个词在任何 Python 的横幅中都会出现最多三次,无论它是否是苹果的。

解决这个问题的方法是运行你想要运行的 Python。例如:

  • 使用 virtualenv 创建一个或多个基于任一或两个安装的虚拟环境,并使用 venv 工具进行选择。
  • 始终使用完整路径——例如,输入 /usr/local/bin/python 来运行 Homebrew 的 Python,输入 /usr/bin/python 来运行苹果的 Python。(并修改你脚本中的 shebang 行以做到这一点。)
  • 更改你的 PATH 变量,确保你想要的那个在前面。对于 Homebrew,你希望 /usr/local/Cellar/python/2.7.3/bin(仅 Python)或 /usr/local/bin(所有)在 /usr/bin 之前;对于苹果,则相反。
  • 将 Python 框架的 bin 目录添加到 PATH,这样你可以单独调整它们的顺序,而不影响一般的二进制文件。(这一点对于 Homebrew Python 并不太相关,因为 Cellar 目录起到了同样的作用。但对于其他第三方 Python 安装可能会有用。)

所有这些也适用于其他工具。很多人因为某个安装的 pipidle 在路径中排在前面,而不同安装的 python 在后面而陷入麻烦。


如果你安装了一个 不同的 Python,例如,通过 python.org 的安装程序,你可能会轻松地遇到上述两个问题。例如,你可能在为 python.org 的 Python 安装东西,但却在运行苹果的 Python,并且这两个都可能没有配置为在 Homebrew 的 site-packages 目录中查找。

撰写回答