我有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失败。
答案 0 :(得分:8)
我认为您正在寻找Python 3.x中的io模块。 cStringIO
(这是{2}的更快版本的Python 2模块,请参阅here)已替换为StringIO
,以及许多其他更改。有关详细信息,请参阅here。
历史记录:以下是我们不再同时拥有io
和cStringIO
的原因:
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