首页 > 解决方案 > 为什么文件名 struct.py 会报错?

问题描述

我正在尝试在 python 中进行图像处理,两天来我遇到了一个问题。

我意识到在尝试以下简单脚本时,将文件命名为 struct.py 会出现错误“numpy.core.multiarray failed to import”:

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 上实际发布问题,如果我应该更改帖子内容或删除不必要的信息或添加更多内容,请告诉我。

标签: pythonnumpystruct

解决方案


您不能命名您的模块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

如您所见numpystruct只是不要使用该名称(或任何通用名称,而不先检查它是否作为内置名称存在)。Python csv 导入的间接变体失败


推荐阅读