【问题标题】:Error importing gtk with python on OS X在 OS X 上使用 python 导入 gtk 时出错
【发布时间】:2013-03-15 00:42:21
【问题描述】:

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

【问题讨论】:

  • 您确定将pygtk 安装到您正在运行的同一个Python 中吗?
  • 另外,请注意 Brew 包清楚地表明(当您 info it、install it 等时)“对于非 Homebrew Python,您需要像这样修改您的 PYTHONPATH:...... ”。除非您使用的是 Homebrew Python,否则您会这样做吗?

标签: python gtk pygtk homebrew


【解决方案1】:

经过OP的澄清,原始答案没有描述他的问题......虽然我认为它是相关的,并且可能对其他人有帮助,所以我会留下它。但首先是相关部分。

在您可以import gtk 之前,您需要调用pygtk.require,如教程的Getting Started 部分所示。 (详情请见PyGTK FAQ。)

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

如果您有多个 Python 2.7 版本(如果您有 2.7.3,那么您肯定有两个,因为 Apple 的版本是 2.7.2),您必须弄清楚您拥有哪些版本,以及您使用哪个版本构建pygtk,并确保您使用的是同一个。

这让我们回到了我留在下面的原始答案。


出现此问题的原因有两个。


首先,如果除了 OS X 附带的 Python 版本之外,您还没有安装任何额外的 Python 版本,那么您可能没有阅读 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 — 即使它是为 Apple 的 Python 安装而安装的。但是 Apple 的 Python 安装默认不会在那里寻找包。所以,你需要按照上面所说的去做。

只需在终端输入此行即可完成该终端会话的其余部分。如果你想让它永久化……嗯,有很多选择,具体取决于你想要什么。详情请见this answer

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

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


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

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

您还可以从 Python 启动横幅中看出,因为 Mountain Lion 附带 2.7.2,而 Homebrew 将安装 2.7.3。 (另外,IIRC,Apple 使用预发布 clang 来构建他们的 Python,而您使用 Homebrew 构建的任何东西都将使用您拥有的任何 clang/gcc/llvm-gcc 构建,这不会是预发布版本......)

注意:仅仅因为您在横幅中的某处看到“Apple”一词并不意味着它是 Apple 的 Python! 如果您构建 Homebrew Python,或安装 python.org Python,它将几乎可以肯定是使用 Apple GCC、Apple Clang 或 Apple LLVM-GCC 构建的。它也在 Apple 操作系统上运行。因此,“Apple”或“apple”将在 any Python(无论是否为 Apple)的横幅中最多出现 3 次。

解决此问题的方法是运行您要运行的 Python。例如:

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

所有这些都适用于其他工具。许多人遇到麻烦,例如,一个安装的 pipidle 在路径中排在第一位,而另一个安装的 python 则...


如果您安装了不同的 Python,例如,通过使用python.org 的安装程序,您很容易遇到上述两种问题。例如,您可能正在为 python.org Python 安装东西,但运行的是 Apple Python,除此之外,任何一个都不能配置为查看 Homebrew 站点包目录。

【讨论】:

  • 感谢您的回答;我正要回复你的 cmets,我已经在 .profile 文件中添加了 export PYTHONPATH=/usr/local/lib/python2.7/site-packages:$PYTHONPATH 行,所以我认为这不是路径问题(否则它不会在解释器处导入 pygtk)。
  • 操作,我不小心按了回车;我要说我正在运行 Apple Build;但版本是 2.7.3(如横幅所示)可能是问题所在?我在几个地方看到需要在import gtk 之前写入pygtk.require("2.0") 行,然后导入gtk;这样解释器就会给我这个错误:Fatal Python error: PyThreadState_Get: no current thread 有什么想法吗?
  • 首先,如果您运行的是 2.7.3,那么您没有运行 Apple 的构建。 Apple 不分发 2.7.3。 (当然,您正在运行使用 Apple 构建的 gcc/llvm-gcc/clang 构建的 Python,并且在 Apple 构建的操作系统上运行,因此您仍然会在横幅中看到一两次他们的名字。但这就是为什么我给出了非常有关如何判断您正在运行的是哪个 Python 的具体说明。如果您不知道您正在运行的是哪个 Python,那么第一步就是找出答案。
  • 再次感谢;我刚刚运行了 Apple 的 Python 并且库正在导入没有问题,在导入后按 Enter 键会启动 XQuartz,我认为这是自制版本上出现致命错误的原因(可能 gtk 找不到路径X11 什么的)。
  • 出于好奇,您为什么要在 2013 年尝试安装基于 X11 的 Gtk+ 和 PyGTK 而不是 PyGObject 等等?
猜你喜欢
  • 2011-08-08
  • 2017-02-28
  • 1970-01-01
  • 1970-01-01
  • 2016-12-06
  • 2013-10-07
  • 2017-02-05
  • 2015-01-20
  • 1970-01-01
相关资源
最近更新 更多