У меня есть код в виде строки и хотел бы сделать модуль из него без записи на диск.
Когда я пытаюсь использовать imp и объект StringIO для этого, я получаю:
>>> imp.load_source('my_module', '', StringIO('print "hello world"'))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: load_source() argument 3 must be file, not instance
>>> imp.load_module('my_module', StringIO('print "hello world"'), '', ('', '', 0))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: load_module arg#2 should be a file or None
Как создать модуль без фактического файла? В качестве альтернативы, как я могу обернуть StringIO в файл без записи на диск?
UPDATE:
ПРИМЕЧАНИЕ. Эта проблема также является проблемой в python3.
Код, который я пытаюсь загрузить, только частично доверяет. Я прошел через это с помощью ast и решил, что он ничего не импортирует и не делает ничего, что мне не нравится, но я не доверяю ему достаточно, чтобы запустить его, когда у меня есть локальные переменные, которые могут быть изменены, и Я не доверяю своему собственному коду, чтобы не вмешиваться в код, который я пытаюсь импортировать.
Я создал пустой модуль, который содержит только следующее:
def load(code):
# Delete all local variables
globals()['code'] = code
del locals()['code']
# Run the code
exec(globals()['code'])
# Delete any global variables we've added
del globals()['load']
del globals()['code']
# Copy k so we can use it
if 'k' in locals():
globals()['k'] = locals()['k']
del locals()['k']
# Copy the rest of the variables
for k in locals().keys():
globals()[k] = locals()[k]
Затем вы можете импортировать mymodule
и вызвать mymodule.load(code)
. Это работает для меня, потому что я гарантировал, что код, который я загружаю, не использует globals
. Кроме того, ключевое слово global
является только директивой анализатора и не может ссылаться на что-либо вне exec.
Это действительно слишком большая работа для импорта модуля без записи на диск, но если вы когда-нибудь захотите это сделать, я считаю, что это лучший способ.