Python импортировать модуль с исходным кодом во временный файл - PullRequest
0 голосов
/ 13 июня 2018
import tempfile

tmp = tempfile.NamedTemporaryFile(delete=True)
try:
    # do stuff with temp
    tmp.write(b'def fun():\n\tprint("hello world!")\n')
    if __name__ == '__main__':
        func = __import__(tmp.name)
        func.fun()
finally:
    tmp.close()  # deletes the file

Итак, я хочу создать временный файл, добавить к нему некоторый исходный код, а затем импортировать модуль и вызвать функцию, но я всегда сталкиваюсь с этой ошибкой:

ModuleNotFoundError: No module named '/var/folders/3w/yyp887lx4018h9s5sr0bwhkw0000gn/T/tmp84bk0bic'

Это неКажется, не найти модуль временного файла.Как мне это решить?

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Импорт может быть выполнен только из определенных каталогов, которые являются частью 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()
0 голосов
/ 13 июня 2018

Есть несколько проблем с вашим кодом:

  1. Ваше имя файла не заканчивается на .py, но модули Python ожидаются.Это можно исправить, установив suffix='.py' в NamedTemporaryFile().
  2. __import__() - неправильный способ загрузки модуля по полному пути.См. Здесь: Как импортировать модуль по полному пути?
  3. Вы не выполняете сброс после записи и перед импортом, поэтому даже если Python найдет файл, он может быть пустым.Добавьте tmp.flush() после написания, чтобы исправить это.
...