Como carregar um módulo do código em uma strin
Tenho algum código na forma de uma string e gostaria de criar um módulo sem gravar no disc
Quando tento usar imp e um objeto StringIO para fazer isso, recebo:
>>> 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
Como posso criar o módulo sem ter um arquivo real? Como alternativa, como posso agrupar um StringIO em um arquivo sem gravar no disco?
ATUALIZAR
NOTA: Este problema também é um problema no python
O código que estou tentando carregar é apenas parcialmente confiável. Passei por isso com ast e determinei que ele não importa nada ou que não gosto, mas não confio o suficiente para executá-lo quando houver variáveis locais em execução que possam ser modificadas e Não confio no meu próprio código para ficar fora do caminho do código que estou tentando importa
Criei um módulo vazio que contém apenas o seguinte:
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]
Então você pode importarmymodule
e ligue paramymodule.load(code)
. Isso funciona para mim porque garanti que o código que estou carregando não useglobals
. Também oglobal
palavra-chave @ é apenas uma diretiva de analisador e não pode se referir a nada fora do exe
Este é realmente muito trabalho paraimport
o módulo sem gravar no disco, mas se você quiser fazer isso, acredito que seja o melhor caminh