2011-06-01 29 views
2

我在學習Python,我嘗試在一個gedit插件中使用Python Markdown。下面是我的文件組織:用PyImport_ImportModuleEx爲gedit插件導入Python模塊

~/.gnome2/gedit/plugins/mytest.gedit-plugin 
~/.gnome2/gedit/plugins/mytest/ 
~/.gnome2/gedit/plugins/mytest/__init__.py 
~/.gnome2/gedit/plugins/mytest/markdown/ 
~/.gnome2/gedit/plugins/mytest/markdown/__init__.py 
~/.gnome2/gedit/plugins/mytest/markdown/preprocessors.py 
~/.gnome2/gedit/plugins/mytest/markdown/OTHER_FILES 
~/.gnome2/gedit/plugins/mytest/markdown/extensions/ 
~/.gnome2/gedit/plugins/mytest/markdown/extensions/__init__.py 
~/.gnome2/gedit/plugins/mytest/markdown/extensions/headerid.py 
~/.gnome2/gedit/plugins/mytest/markdown/extensions/OTHER_FILES 

解說:

我的文件mytest.gedit-plugin只包含最少的代碼來聲明插件:

[Gedit Plugin] 
Loader=python 
Module=mytest 
IAge=2 
Name=My test 

我的插件有它自己的子文件夾(mytest) 。該文件包含mytest/__init__.py

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

import gedit 
import markdown 

class MyTestPlugin(gedit.Plugin): 
    def __init__(self): 
     gedit.Plugin.__init__(self) 

    def activate(self, window): 
     texte = "# Header 1 {#id}" 
     print markdown.markdown(texte, extensions=['headerid']) 

最後,該文件夾包含mytest/markdown默認的Python代碼降價。

當激活我在gedit中(編輯>首>插件)插件,在終端的輸出是:

Traceback (most recent call last): 
    File "/home/moi/.gnome2/gedit/plugins/mytest/__init__.py", line 5, in <module> 
    import markdown 
    File "/home/moi/.gnome2/gedit/plugins/mytest/markdown/__init__.py", line 161, in <module> 
    import preprocessors 
    File "/home/moi/.gnome2/gedit/plugins/mytest/markdown/preprocessors.py", line 11, in <module> 
    import markdown 
ImportError: No module named markdown 

** (gedit:8790): WARNING **: Error loading plugin 'My test' 

然而,我成功地使用Python降價以外的gedit。例如,以下文件的偉大工程,當我在同一個位置的終端作爲Python的降價主文件夾中運行它:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

import markdown 

texte = "# Header 1 {#id}" 
print markdown.markdown(texte, extensions=['headerid']) 

我發現,如果我在Python降價文件更改import markdownimport __init__ as markdown,我可以使用Python的降價沒有它的擴展(mytest/markdown/extensions/),但無論如何,它仍然無法與我的工作,例如:

/home/moi/.gnome2/gedit/plugins/mytest/markdown/__init__.py:114: MarkdownWarning: Failed loading extension 'headerid' from 'markdown.extensions.headerid' or 'mdx_headerid' 
    warnings.warn(text, MarkdownWarning) 
<h1>Header 1 {#id}</h1> 

所以,我的問題是我怎麼能修改import進行功能擴展,如何在本地安裝PythonMarkdown(如在$HOME中,無root權限),以便能夠在gedit插件中使用Python Markdown?

非常感謝。

注:我認爲gedit使用PyImport_ImportModuleEx()加載插件,所以這就是爲什麼我把它放在我的問題的標題。


編輯1: 2的細節:沒有根安裝並可能修改的Python降價文件。

編輯2:擴展在載有下面的代碼mytest/markdown/__init__.py(約525行):

# Setup the module names 
ext_module = 'markdown.extensions' 
module_name_new_style = '.'.join([ext_module, ext_name]) 
module_name_old_style = '_'.join(['mdx', ext_name]) 

# Try loading the extention first from one place, then another 
try: # New style (markdown.extensons.<extension>) 
    module = __import__(module_name_new_style, {}, {}, [ext_module]) 
except ImportError: 
    try: # Old style (mdx.<extension>) 
     module = __import__(module_name_old_style) 
    except ImportError: 
     message(WARN, "Failed loading extension '%s' from '%s' or '%s'" 
      % (ext_name, module_name_new_style, module_name_old_style)) 
     # Return None so we don't try to initiate none-existant extension 
     return None 

也許有一種方法使用相對路徑來導入。我真的是Python的初學者。

回答

2

如果你想在不修改的情況下使用markdown,那麼你將不得不把它放在Python庫期望的地方,比如site-packages/。否則,您將不得不修改它以使用相對導入而不是絕對導入。

+0

感謝您的回答。如有必要,我可以修改Python Markdown來導入擴展。我編輯了我的問題,注意我必須使用無需root權限的插件。 – jpfleury 2011-06-01 22:45:25

+0

gedit可能會在搜索模塊時提供自己的位置;你可以檢查'sys.path'來發現它們。 – 2011-06-01 22:46:41

+0

我做了一個關於'site-packages /'的搜索,我發現從Python 2.6開始,可以使用每個用戶的'site-packages'。參見[PEP370](http://www.python.org/dev/peps/pep-0370/)。它工作非常好。 – jpfleury 2011-06-02 18:29:16