【问题标题】:no module named StringIO没有名为 StringIO 的模块
【发布时间】:2018-08-02 23:39:56
【问题描述】:

我有 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' 没有?我该如何解决这个问题?

操作.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 失败。

【问题讨论】:

  • 请提供一个最小的工作样本。从run.py 执行operation.py 是什么意思?
  • “我知道此导入确实有效,因为我试图将其设为注释但它无法运行” - 这并不意味着导入有效。无论是否导入,您的代码都同样被破坏。
  • 1.您需要从io import StringIO 输入。然后,2.你需要比“当我使用这个导入时,这个模块的功能不再起作用”更清楚地描述问题。什么不起作用以及如何起作用?

标签: python python-3.x stringio cstringio


【解决方案1】:

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

历史记录:这就是我们不再同时拥有cStringIOStringIO 的原因:

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

【讨论】:

    【解决方案2】:

    使用这个:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-28
      • 2017-12-30
      • 2018-01-06
      • 2018-11-11
      • 2015-04-10
      • 2013-11-27
      • 2014-02-17
      相关资源
      最近更新 更多