Импортируйте модуль Python с PyImport_ImportModuleEx для плагина gedit - PullRequest
2 голосов
/ 02 июня 2011

Я изучаю Python и пытаюсь использовать Python Markdown в плагине gedit.Вот как организованы мои файлы:

~/.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

Explication:

Мой файл 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 ( Edit> Preferences>Плагины ), вывод в терминал:

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 Markdown вне gedit.Например, следующий файл прекрасно работает, когда я запускаю его в терминале в том же месте, что и главная папка 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 в локальном расположении (то есть в $HOME, без корневого доступа), чтобы иметь возможность использовать Python Markdown в плагине gedit?

Большое спасибо.

Примечание: Я думаю, что gedit использует PyImport_ImportModuleEx() для загрузки плагинов, поэтому я поместил его в заголовок моего вопроса.


Редактировать 1: 2 детали: без установки root и возможность изменять файлы Python Markdown.

Редактировать 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.

1 Ответ

2 голосов
/ 02 июня 2011

Если вы хотите использовать markdown без его изменения, вам придется поместить его где-нибудь там, где его ожидает библиотека Python, например, в site-packages/.В противном случае вам придется изменить его для использования относительного импорта вместо абсолютного импорта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...