【发布时间】:2021-04-27 08:20:38
【问题描述】:
我对 Python 3.8.6 中的 numpy 包有一些奇怪的问题。我正在尝试编写 float64 的 numpy 数组,但有时它会将十六进制字符写入文件:\x00\x00...
这是我正在运行的代码:
#!/usr/bin/env python
# coding: utf-8
import numpy as np
from pathlib import Path
import shutil as sh
resdir = Path('./results/')
if not resdir.is_dir():
resdir.mkdir(parents=True)
trajdir = resdir / 'traj'
if trajdir.is_dir():
sh.rmtree(trajdir)
trajdir.mkdir()
phi = np.zeros([2**12,2], dtype=np.float_)
itermax = 100
idump_fmt = '{:03d}'
# loop
# dump
for i in range(1, itermax):
print("i = {:d}".format(i))
fname = 'i' + idump_fmt.format(i) + '.dat'
np.savetxt(trajdir / fname, np.zeros(phi.shape, dtype=phi.dtype))
np.loadtxt(trajdir / fname).T
我在 docker 容器中运行此代码。我有一个基于下面 Dockerfile 的 docker 映像,我正在运行命令:
docker run --rm -it -v $PWD:/home/python/shared -w /home/python/shared savetxt-test:latest python test_savetxt.py
savetxt-test:latest 是我的 docker 镜像的名称,test_savetxt.py 是包含上述代码的文件。
并非总是如此,但可能每 2-3 次一次,上述命令会产生以下错误:
Traceback (most recent call last):
36 File "test_savetxt.py", line 25, in <module>
37 np.loadtxt(trajdir / fname).T
38 File "/usr/local/lib/python3.8/site-packages/numpy/lib/npyio.py", line 1139, in loadtxt
39 for x in read_data(_loadtxt_chunksize):
40 File "/usr/local/lib/python3.8/site-packages/numpy/lib/npyio.py", line 1067, in read_data
41 items = [conv(val) for (conv, val) in zip(converters, vals)]
42 File "/usr/local/lib/python3.8/site-packages/numpy/lib/npyio.py", line 1067, in <listcomp>
43 items = [conv(val) for (conv, val) in zip(converters, vals)]
44 File "/usr/local/lib/python3.8/site-packages/numpy/lib/npyio.py", line 763, in floatconv
45 return float(x)
46 ValueError: could not convert string to float: '\x00\x00\x00\x00\x00\x00\x[...]
我使用的是 Mac OS 11.1,当我直接在我的系统中运行此代码(而不是通过 docker 容器)时,我没有遇到此问题。我怀疑这可能与 docker 的安装问题有关,但我不确定如何解决这个问题。有什么想法吗?
Dockerfile:
FROM python:3.8-slim-buster
########## preconfig ##########
USER root
ENV DEBIAN_FRONTEND=noninteractive
RUN export DEBIAN_FRONTEND
RUN apt-get update \
&& apt-get -y install libssl-dev \
&& apt-get clean \
&& pip install wheel
RUN pip install --upgrade pip
# Install dependencies
RUN apt-get update && apt-get install -y less
########## python ##########
RUN pip install numpy
########################
#add new sudo user
RUN apt-get install -y sudo
ENV USERNAME python
ENV GROUPNAME python
ENV UID 1000
ENV GID 1000
RUN groupadd --gid $GID $GROUPNAME && \
useradd -g $GROUPNAME -u $UID -m $USERNAME && \
echo "$USERNAME:$USERNAME" | chpasswd && \
usermod --shell /bin/bash $USERNAME && \
usermod -aG sudo $USERNAME && \
echo "$USERNAME ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/$USERNAME && \
chmod 0440 /etc/sudoers.d/$USERNAME
USER $USERNAME
########## docker behavior ##########
CMD /bin/bash
【问题讨论】:
标签: python python-3.x macos docker numpy