Python 导入存储在cStringIO数据结构中的模块与物理磁盘文件

Python 导入存储在cStringIO数据结构中的模块与物理磁盘文件,python,import,module,Python,Import,Module,是否有方法导入存储在cStringIO数据结构与物理磁盘文件中的Python模块 我需要的似乎是“imp.load_compiled(name,pathname[,file])”,但此方法(以及类似方法)的描述有以下免责声明: Quote:“文件参数是字节编译的代码文件,从一开始就以二进制模式打开读取。它当前必须是真实的文件对象,而不是模拟文件的用户定义类。”[1] 我试着使用cStringIO对象而不是真正的文件对象,但是帮助文档是正确的-只能使用真正的文件对象 关于为什么这些模块会施加这样的

是否有方法导入存储在cStringIO数据结构与物理磁盘文件中的Python模块

我需要的似乎是“imp.load_compiled(name,pathname[,file])”,但此方法(以及类似方法)的描述有以下免责声明:

Quote:“文件参数是字节编译的代码文件,从一开始就以二进制模式打开读取。它当前必须是真实的文件对象,而不是模拟文件的用户定义类。”[1]

我试着使用cStringIO对象而不是真正的文件对象,但是帮助文档是正确的-只能使用真正的文件对象

关于为什么这些模块会施加这样的限制,或者这只是一个历史产物,有什么想法吗

我可以使用什么技术来避免这种物理文件要求

谢谢, 马尔科姆


[1] 也许是这样的

import types
import sys

src = """
def hello(who):
    print 'hello', who
"""

def module_from_text(modulename, src):
    if modulename in sys.modules:
        module = sys.modules[modulename]
    else:
        module = sys.modules[modulename] = types.ModuleType(modulename)
    exec compile(src, '<no-file>', 'exec') in module.__dict__
    return module

module_from_text('flup', src)
import flup
flup.hello('world')
编辑


以这种方式评估代码接近编写自定义导入程序的领域。这可能是有用的,看看道格·赫尔曼的

马特:我一直在研究和试验你的代码,效果很好。不知道你是否能帮我解决以下几个问题:1。为什么我不需要对模块_从_text()返回的模块值执行任何操作?2.为什么要使用module.\u dict vs.globals(),locals()作为exec语句的'in'子句的值?3.只要我的src值来自可信的来源,这种方法有什么缺点吗?非常感谢。Malcolm@Malcolm: 1. 您可以对返回的值执行任何操作,但不需要它,因为模块现在位于
sys.modules
中。2.因为您希望代码在模块的名称空间中执行(并将定义和赋值放在其中);如果您
exec
'd位于其他名称空间中,则分配不会在模块中结束。3.不确定。我相信,这与导入内部构件的工作方式类似,但我可能遗漏了一些重要的内容(比如异常处理)。请参阅文章正文以获取一些参考资料。非常感谢您的帮助。你的解释和相关的参考资料帮助回答了我的问题。Malcolm,对于那些遵循这条思路的人,我正试图构建一个基于imp模块的解决方案。下面马特的解决方案要优雅得多。
hello world