为什么文件名struct.py给出错误?

时间:2020-08-09 19:30:18

标签: python numpy struct

我正在尝试使用python进行图像处理,并且有两天时间我陷入了一个问题。

我意识到在尝试以下简单脚本时,将文件命名为struct.py会出现错误“ numpy.core.multiarray无法导入”。

import numpy as np

k = np.ones((9,9))

print(k)

使用其他名称创建文件时,相同的代码也起作用。

现在,我正在寻找有关为什么发生这种情况的答案。

我创建了一个测试文件“ struct.py”,以尝试用于形态学操作的不同结构元素。在我所有其他测试文件中,numpy都能正常工作,但是由于某种原因,在该“ struct.py”脚本中,我收到一条错误消息,提示“ numpy.core.multiarray导入失败”。我对解决这个问题非常投入,以至于在解决过程中,我不打算测试numpy是否在我的其他脚本(以前工作过的脚本)中工作过

我多次重新安装了python,切换了IDE,尝试在本地进行编码而不是使用版本控制器,但是所有这些事情对于我来说似乎都是不必要的,因为我不知道那可能是numpy不这样做的原因工作。

今天,我看到有一个名为struct的python模块,并且我在脚本中使用该名称一定是导致问题的原因,但我仍然不明白为什么numpy会因此而停止工作。 numpy是否依赖于struct模块?这怎么可能发生?

这也是我第一次真正在stackoverflow上发布问题,请让我知道我是否应该更改帖子内容或删除不必要的信息或添加更多内容。

2 个答案:

答案 0 :(得分:4)

您不得命名模块struct.py,因为struct模块是内置模块(此模块用于对数据/从内存/磁盘进行序列化/反序列化,并具有数字类型的字节序和大小管理) )

>>> import struct
>>> struct.__file__
'C:\\Users\\xxxx\\AppData\\Local\\Programs\\Python\\Python37\\lib\\struct.py'

如果您以相同的方式创建文件,如果另一个模块尝试导入内置的struct模块,它可能会导入您的模块,并且可能会出现难以理解的错误。

如果我在当前目录中创建一个struct.py文件,其中仅包含:

print("hellooooo bug")

导入numpy时会发生什么:

>>> import numpy
hellooooo bug
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\jotd6\AppData\Local\Programs\Python\Python37\lib\site-packages\numpy\__init__.py", line 140, in <module>
    from . import _distributor_init
  File "C:\Users\jotd6\AppData\Local\Programs\Python\Python37\lib\site-packages\numpy\_distributor_init.py", line 9, in <module>
    from ctypes import WinDLL
  File "C:\Users\jotd6\AppData\Local\Programs\Python\Python37\lib\ctypes\__init__.py", line 14, in <module>
    from struct import calcsize as _calcsize

如您所见numpy需要struct。只是不要使用该名称(或任何通用名称,而无需先检查它是否不内置)。 Python csv import fails

的间接变体

答案 1 :(得分:2)

我很确定这是因为在numpy模块中有一个名为pickle.py的文件,其中包含名为from struct import pack, unpack的行,因为您的文档被称为struct但不包含pack或unpack,由于循环导入。