在OS X上使用python导入gtk时出错

时间:2013-03-15 00:42:22

标签: python gtk pygtk homebrew

我刚刚通过Homebrew安装了pygtk(很棒的工具)以及它的依赖性(包括gtk +);问题是,当我尝试在python解释器上导入gtk时,它抛出一个ImportError,当将pygtk或任何其他模块导入解释器时不会发生这种情况,我无法弄清楚是什么问题。 :S

1 个答案:

答案 0 :(得分:1)

在OP的澄清之后,原来的答案并没有描述他的问题......虽然我认为它是相关的,它可以帮助其他人,所以我会离开它。但首先是相关部分。

import gtk之前,您需要致电pygtk.require,如本教程的Getting Started部分所示。 (有关详细信息,请参阅PyGTK FAQ。)

那应该可以解决你的问题...但你只是在崩溃Fatal Python error: PyThreadState_Get: no current thread。有很多原因你可以得到这个,但在这种情况下最有可能的是你正在运行一个C扩展(pygtk / gtk /无论如何)为一个版本的Python构建不同版本的Python。 (这实际上也是covered in the PyGTK FAQ,但在这种情况下,这是CPython C扩展模块的一个更普遍的问题,而不是PyGTK特有的。)

如果你有多个Python 2.7版本(如果你有2.7.3,你肯定有两个,因为Apple是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 的说明,或者信息等等:

例如:

pip

Homebrew将Python软件包安装到/usr/local/lib/pythonX.Y-even,如果它正在安装Apple的Python安装。但Apple的Python安装默认不会在那里查找包。所以,你需要做这个说法。

只需在终端输入此行即可用于该终端会话的其余部分。如果你想让它永久化......好吧,有很多选择,具体取决于你想要什么。有关详细信息,请参阅this answer

Gems, Eggs and Perl ModulesHomebrew and Python详细说明了这一点。

(这是Homebrew通常建议尽可能使用brew的多种原因之一,而不是在python中查找包。但是有一些例外,我很容易相信pygtk是其中之一。)


其次,如果您安装了Homebrew的Python,您可能没有正确设置PATH,因此您将软件包安装到Homebrew Python的站点软件包中,而是运行Apple Python安装。

如果您只是输入which python并且不知道您正在运行哪一个,/usr/bin/python应该告诉您。如果它是/usr/local/bin/python它是Apple的;如果它是virtualenv,那就是Homebrew的。

您也可以从Python启动横幅告诉,因为Mountain Lion附带2.7.2,而Homebrew将安装2.7.3。 (另外,IIRC,Apple使用预发布铿锵来构建他们的Python,而你用Homebrew构建的任何内容都将使用你拥有的任何clang / gcc / llvm-gcc构建,这不会是一个预发布版本......)

注意:仅仅因为你在横幅中看到“Apple”这个词并不意味着它是Apple的Python!如果你构建一个自制的Python,或者安装一个python.org Python,它将会几乎可以肯定是用Apple GCC,Apple Clang或Apple LLVM-GCC构建的。它也在Apple OS上运行。因此,“Apple”或“apple”将在任何 Python,Apple或不是Apple的横幅中出现最多三次。

对此的修复是运行您要运行的Python。例如:

  • 使用/usr/local/bin/python根据其中一个或两个安装创建一个或多个虚拟环境,并使用venv工具进行选择。
  • 始终使用完整路径 - 例如,键入/usr/bin/python以运行Homebrew的Python,PATH来运行Apple。 (并修改任何脚本中的shebang行以执行相同操作。)
  • 更改您的pip变量,以确保您想要的任何一个首先出现。对于Homebrew,你需要/ usr / bin之前的/usr/local/Cellar/python/2.7.3/bin(仅用于Python)或/ usr / local / bin(用于所有内容);对于Apple来说,反过来。
  • 将Python框架bin目录添加到PATH,因此您可以将它们的顺序与常规二进制文件分开操作。 (这与Homebrew Python并不真正相关,因为Cellar目录具有相同的用途。但它可以用于其他第三方Python安装。)

所有这些都适用于其他工具。许多人遇到麻烦,例如,一个安装的idlepython在路径中排在第一位,而另一个装置的{{1}}确实...


如果您已经安装了不同的 Python,例如,使用python.org中的安装程序,您可以轻松地两个上述问题。例如,你可以为python.org Python安装东西,但运行Apple Python,除此之外,没有人可以配置为查看Homebrew site-packages目录。