Модуль импорта хранится в структуре данных cStringIO по сравнению с файлом физического диска - PullRequest
2 голосов
/ 04 мая 2010

Есть ли способ импортировать модуль Python, хранящийся в структуре данных cStringIO, вместо файла физического диска?

Похоже, мне нужно "imp.load_compiled (name, pathname [, file])", но описание этого метода (и аналогичных методов) содержит следующий отказ от ответственности:

Цитата: «Аргументом файла является файл скомпилированного байта кода, открытый для чтения в двоичном режиме с самого начала. В настоящее время он должен быть реальным файловым объектом, а не определяемым пользователем классом, эмулирующим файл». [1]

Я пытался использовать объект cStringIO вместо реального файлового объекта, но справочная документация верна - можно использовать только настоящий файловый объект.

Любые идеи о том, почему эти модули будут налагать такое ограничение или это просто исторический артефакт?

Могу ли я использовать какие-либо методы, чтобы избежать этого требования к физическому файлу?

Спасибо, Malcolm

[1] http://docs.python.org/library/imp.html#imp.load_module

1 Ответ

3 голосов
/ 04 мая 2010

Что-то вроде этого возможно?

import types
import sys

src = """
def hello(who):
    print 'hello', who
"""

def module_from_text(modulename, src):
    if modulename in sys.modules:
        module = sys.modules[modulename]
    else:
        module = sys.modules[modulename] = types.ModuleType(modulename)
    exec compile(src, '<no-file>', 'exec') in module.__dict__
    return module

module_from_text('flup', src)
import flup
flup.hello('world')

Какие отпечатки:

hello world

EDIT

Оценка кода таким образом выходит за рамки написания пользовательских импортеров. Может быть полезно взглянуть на PEP 302 и на Даг Хеллманн PyMOTW: модули и импорт .

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