2014-03-28 69 views
1

Python的gtk模塊會導入一個名爲gdk的 模塊。任何地方都沒有實際的gdk模塊。該 開始gtk/__init__.py模塊看起來是這樣的:PyGTK的「gdk」模塊存在的問題

# load the required modules: 
import gobject as _gobject 

ver = getattr(_gobject, 'pygobject_version',()) 
if ver < (2, 11, 1): 
    raise ImportError(
     "PyGTK requires PyGObject 2.11.1 or higher, but %s was found" % (ver,)) 

if 'gtk._gtk' in sys.modules: 
    _gtk = sys.modules['gtk._gtk'] 
else: 
    from gtk import _gtk 

import gdk 

顯然gdk,像Athena,泉水提出完全從 _gtk.so共享庫包括gtk模塊中形成。這是所有 很好,但我試圖讓處理的問題是, 使用weechat,加載使用gtk工作的 第一次Python腳本,但隨後失敗,這樣的回溯:

python: loading script "/home/username/.weechat/python/lnotify.py" 
python: stdout/stderr: Traceback (most recent call last): 
python: stdout/stderr: File "/home/username/.weechat/python/lnotify.py", line 20, in <module> 
python: stdout/stderr:  import weechat, string, pynotify 
python: stdout/stderr: File "/usr/lib64/python2.7/site-packages/gtk-2.0/pynotify/__init__.py", line 19, in <module> 
python: stdout/stderr:  import gtk 
python: stdout/stderr: File "/usr/lib64/python2.7/site-packages/gtk-2.0/gtk/__init__.py", line 42, in <module> 
python: stdout/stderr:  import gdk 
python: stdout/stderr: ImportError: No module named gdk 
python: unable to parse file "/home/username/.weechat/python/lnotify.py" 

因此,發生了一些事情,突然gtk模塊 變得無法找到共享庫中的gdk模塊。我是 甚至不知道從哪裏開始進一步診斷,因爲我不是 完全確定可能會導致此類符號解決問題的原因。

你以前見過類似的東西嗎?

+0

幾個問題a)你可以通過'gi.repository'而不是'pygtk'使用自省嗎?你能否在沒有「weechat」的情況下重現這一點(即確保在導入之前所有導入都已重置)?不幸的是,我無法幫助超越..你是否按照建議'import gtk.gdk' http://stackoverflow.com/questions/5923746/problems-importing-gdk – drahnr

回答

1

問題源於每個進程只加載一次C擴展模塊,而WeeChat在該單一進程上下文中使用多個解釋器實例,每個腳本一個。這does not play well與擴展模塊for a number of reasons

在這種特殊情況下,只有在第一次導入擴展模塊gtk._gtk時,模塊初始化纔會運行一次,正如您所注意的那樣,其中gtk.gdk會彈出。從那時起,對import gtk的每一次嘗試都會發現_gtk已經被加載,因此在新的解釋器上下文中複製了其模塊字典的淺表副本。這會讓你訪問gtk._gtk,但擴展初始化函數不會再次被調用,這就是爲什麼後續解釋器會丟失gtk.gdk

您可以通過導入gtk,從sys.modules刪除引用和再次導入gtk重現不WeeChat或使用子解釋這一行爲:

import sys 
import gtk 
for mod in sys.modules.keys(): 
    if mod.startswith('gtk'): 
     sys.modules.pop(mod) 
import gtk 
# throws "ImportError: No module named gdk" 

沒有解決這個沒有簡單的方法。你可以嘗試和

  1. 修復PyGTK的使用初始化過程,是(重新)加載它在不同的解釋方面
  2. fork()在WeeChat執行提供真正隔離每個腳本(兼容的,但做什麼在Windows上?),並以額外開銷爲代價來避免此問題。