python在临时fi中导入带有源代码的模块

2024-04-28 12:37:49 发布

您现在位置:Python中文网/ 问答频道 /正文

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

所以我想创建一个临时文件,添加一些源代码,然后导入模块并调用函数,但我总是遇到这样的错误:

^{pr2}$

它似乎找不到临时文件的模块。我怎么解决这个问题?在


Tags: 模块nameimporttruewithtempfiledeletedo
2条回答

您的代码存在一些问题:

  1. 文件名不以.py结尾,但Python模块应该以.py结尾。您可以通过在NamedTemporaryFile()中设置suffix='.py'来解决这个问题。在
  2. __import__()不是从完整路径加载模块的正确方法。请看这里:How to import a module given the full path?
  3. 在写入文件之后和导入之前不会刷新,因此即使Python确实找到了该文件,它也可能是空的。在写入后添加tmp.flush()以修复此问题。在

导入只能从属于PYTHON_PATH的某些目录中完成。你可以延长这个时间。然后必须使用__import__()和模块名(而不是文件系统中的路径)。您必须处理临时文件的后缀。在

我使用临时模块文件的本地目录实现了一个简单版本,并使用适当的tempfile实现了一个版本:

#!/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()

相关问题 更多 >