1

我有python 3.6。我想从另一个名为“run.py”的python文件中执行名为“operation.py”的python文件。

operation.py我做from cStringIO import StringIO. PyCharm 向我显示没有名为 StringIO 的模块的警告。我知道从 python3 开始我必须从 io 导入 StringIO 模块。但是,当我使用此导入时,此模块的功能不再起作用。

尽管 中有警告from cStringIO import StringIO,但代码仍然有效(我知道此导入确实有效,因为我试图将其设为注释但无法运行)。问题是,当我尝试通过“run.py”文件运行此文件时,它无法运行并打印以下消息:ModuleNotFoundError: No module named 'cStringIO'.

我尝试在 PyCharm 中使用这个未解决的参考问题,但没有帮助。

为什么“operation.py”会通过警告运行,而“run.py”却不会?我该如何解决这个问题?

操作.py:

    from cStringIO import StringIO


    str_io = StringIO()
    g = Generator(str_io, False)
    # There is a full code here...

运行.py:

    import operation


    def main():
        operation

operation.py警告但运行良好,run.py 失败。

4

2 回答 2

8

我认为您正在寻找Python 3.x中的io模块。cStringIO(这是一个 Python 2 模块,是 的更快版本StringIO,请参见此处)被替换为io,以及许多其他更改。有关详细信息,请参见此处。

历史注释:这是我们不再同时拥有cStringIO和的原因StringIO

Python 2.x 中的一个常见模式是在纯 Python 中实现一个模块版本,并以 C 扩展实现可选的加速版本;例如,pickle 和 cPickle。这将导入加速版本和退回到这些模块的每个用户的纯 Python 版本的负担。在 Python 3.0 中,加速版本被视为纯 Python 版本的实现细节。用户应始终导入标准版本,它会尝试导入加速版本并回退到纯 Python 版本。pickle / cPickle 对接受了这种处理。配置文件模块在 3.1 的列表中。StringIO 模块已经变成了 io 模块中的一个类。(来源

于 2018-02-22T23:44:01.533 回答
4

使用这个:

 try:
    from StringIO import StringIO
 except ImportError:
    from io import StringIO
于 2020-11-05T11:00:25.710 回答