Импорт может быть выполнен только из определенных каталогов, которые являются частью PYTHON_PATH
.Вы можете продлить это.Тогда вам придется использовать __import__()
с именем модуля (не путь в файловой системе).Вам придется иметь дело с суффиксом для временного файла.
Я реализовал простую версию, используя локальный каталог для файла временного модуля, и версию, использующую надлежащий временный файл:
#!/usr/bin/env python3
import sys
import os
import tempfile
SCRIPT = '''\
def fun():
print("hello world!")
'''
# simple version using the local directory:
with open('bla.py', 'w') as tmp_module_file:
tmp_module_file.write(SCRIPT)
import bla
bla.fun()
# version using the tempfile module:
tmpfile = tempfile.NamedTemporaryFile(suffix='.py', delete=True)
try:
tmpfile.write(SCRIPT.encode('utf8'))
tmpfile.flush()
tmpmodule_path, tmpmodule_file_name = os.path.split(tmpfile.name)
tmpmodule_name = tmpmodule_file_name[:-3] # strip off the '.py'
sys.path.append(tmpmodule_path)
tmpmodule = __import__(tmpmodule_name)
finally:
tmpfile.close()
tmpmodule.fun()