Centos 6.6,python 2.7.2 对象没有属性'StringIO
Posted
技术标签:
【中文标题】Centos 6.6,python 2.7.2 对象没有属性\'StringIO【英文标题】:Centos 6.6, python 2.7.2 object has no attribute 'StringIOCentos 6.6,python 2.7.2 对象没有属性'StringIO 【发布时间】:2016-02-28 20:47:50 【问题描述】:我正在尝试在 docker 容器中运行我的 python 测试。这是使用 CentsOS 6.6 安装 python .2.7.2 的 Dockerfile 的一部分:
RUN cd /tmp && \
wget https://www.python.org/ftp/python/2.7.2/Python-2.7.2.tgz && \
tar xvfz Python-2.7.2.tgz && \
cd Python-2.7.2 && \
./configure --prefix=/usr/local && \
make && \
make altinstall
RUN ln -s /usr/local/bin/python2.7 /usr/local/bin/python
RUN wget https://bootstrap.pypa.io/ez_setup.py -O - | /usr/local/bin/python2.7
RUN /usr/local/bin/easy_install-2.7 pip
RUN pip install python-gflags sqlparse pyyaml requests HTTPretty
在 docker 容器中运行测试时出现异常:
import io
# some code here...
buf = io.StringIO(data)
AttributeError: 'module' object has no attribute 'StringIO'
在本地或服务器环境上运行测试时,我没有收到此异常。
我尝试在 docker 容器中执行简单的脚本:
import io
print io.StringIO(None)
工作正常。我糊涂了。这可能是什么问题?
@Blckknght,你是对的,代码有名为 io 的模块:
io.__file__ ::: /root/containerfolder/proejct/py/src/common/io.pyc
。但我只能在 docker 中重现它。当我将代码复制粘贴到服务器或本地运行时,我做对了
io.__file__ ::: /opt/py/ext/python-2.7.2/lib/python2.7/io.pyc
除了重命名模块之外,修复它的正确方法是什么:)?
回答:
@Blckknght 是对的,有一个名为“IO”的代码模块 (!!!大写!!!)隐藏内置“io” 我的“本地”MacOS FS 不区分大小写,但会保留大小写,它区分 io 和 IO,这就是我在本地获得正确“io”的原因。 服务器具有区分大小写的 FS Docker 映像具有不区分大小写的 FS。这就是为什么它只在那里失败的原因。这是一个很好的挑战,谢谢:)
【问题讨论】:
我猜你的开发系统上有一个名为io.py
的本地模块,但它不在服务器上。它隐藏了内置的 io
模块,因此您在该模块中找不到您期望的东西。
我认为@Blckknght 是对的。您可以通过 print io.__file__ 查看导入模块的路径,以确保导入了正确的模块。
嗯...会尝试,我只在 docker 中看到 io.StringIO 问题。服务器/开发笔记本电脑没有这样的问题。
请查看更新后的问题,你是对的......
你可以把它放在另一个包中,而不是重命名模块,这样它总是限定为foo.io
而不是io
。
【参考方案1】:
@Blckknght 是对的,有一个名为“IO”的代码模块(!!!大写!!!)隐藏了内置的“io”
我的“本地”MacOS FS 不区分大小写,但会保留大小写,它区分 io 和 IO,这就是我在本地获得正确“io”的原因。
服务器具有区分大小写的 FS
Docker 映像具有不区分大小写的 FS。这就是为什么它只在那里失败。
这是一个很好的挑战,谢谢:)
【讨论】:
以上是关于Centos 6.6,python 2.7.2 对象没有属性'StringIO的主要内容,如果未能解决你的问题,请参考以下文章
在Linux CentOS 6.6上安装Python 2.7.9
在Linux CentOS 6.6上安装Python 2.7.9