没有名为StringIO

时间:2018-02-22 23:35:46

标签: python python-3.x stringio cstringio

我有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'

我尝试使用此Unresolved reference issue in PyCharm,但它没有帮助。

为什么'operation.py'会运行警告,但'run.py'不会?我怎么解决这个问题?

operation.py:

    from cStringIO import StringIO


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

run.py:

    import operation


    def main():
        operation

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

2 个答案:

答案 0 :(得分:8)

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

历史记录:以下是我们不再同时拥有iocStringIO的原因:

  

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

答案 1 :(得分:0)

使用这个:

 try:
    from StringIO import StringIO
 except ImportError:
    from io import StringIO