【问题标题】:python import a module with source code in temporary filepython在临时文件中导入带有源代码的模块
【发布时间】:2018-06-13 12:10:19
【问题描述】:
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'

似乎没有找到临时文件的模块。我该如何解决?

【问题讨论】:

  • 临时模块文件可能不在PYTHON_PATH 中提到的任何目录中。将临时模块文件放在主脚本文件旁边并从那里导入怎么样?这应该是可能的。
  • @Alfe 不知道该怎么做,去文档看看我该怎么做
  • 为什么要把这些东西写到文件里而不是eval("your code here")

标签: python temp


【解决方案1】:

您的代码存在一些问题:

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

【讨论】:

  • 根据@Alfe,我在当前目录中创建了作为脚本本身的文件,我也尝试过刷新,我还给文件命名为.py扩展名,仍然得到相同错误
  • @J.Doe:你还在用__import__()吗?你不应该。
  • 是的,我当时就是
【解决方案2】:

只能从属于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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-18
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 2016-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多