Я изучаю 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
Объяснение:
Мой файл 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'
Однако я успешно использую 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
, без root-доступа), чтобы иметь возможность использовать Python Markdown в плагине gedit?
Большое спасибо.
Примечание: я думаю, что gedit использует PyImport_ImportModuleEx()
для загрузки плагинов, поэтому я указал его в заголовке своего вопроса.
Редактировать 1: 2 детали: нет корневой установки и можно изменять файлы 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.