使用PyImport_ImportModuleEx导入Python模块以获取gedit插件

时间:2011-06-01 22:13:44

标签: python import gedit

我正在学习Python,我尝试在gedit插件中使用Python Markdown。以下是我的文件组织方式:

~/.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 Markdown代码。

当我在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'

但是,我在gedit之外成功使用了Python Markdown。例如,当我在与Python Markdown主文件夹相同的位置的终端中运行它时,以下文件很有用:

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

import markdown

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

我发现如果我更改了import markdown的Python Markdown文件中的import __init__ as markdown,我可以使用Python Markdown而不使用其扩展名(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扩展名,如何在本地安装中安装Python Markdown(所以在{{ 1}},没有root访问权限)能够在gedit插件中使用Python Markdown吗?

非常感谢。

注意:我认为gedit使用$HOME来加载插件,这就是为什么我把它放在我的问题的标题中。


编辑1: 2详细信息:无root安装,可以修改Python Markdown文件。

修改2:扩展程序在PyImport_ImportModuleEx()中加载了以下代码(关于第525行):

mytest/markdown/__init__.py

也许有一种方法可以用相对路径导入。我是Python的初学者。

1 个答案:

答案 0 :(得分:2)

如果你想使用markdown而不修改它,那么你将不得不把它放在Python库所期望的地方,例如在site-packages/中。否则,您将不得不修改它以使用相对导入而不是绝对导入。