【问题标题】:Why does the file name struct.py give errors?为什么文件名 struct.py 会报错?
【发布时间】:2020-08-09 19:30:18
【问题描述】:

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

【问题讨论】:

    标签: python numpy struct


    【解决方案1】:

    您不得将您的模块命名为 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的间接变体

    【讨论】:

    • 非常感谢您的详细解释!现在我明白了。
    【解决方案2】:

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

    【讨论】:

    • 错误信息很长,它包含模块名称,如 pickle5、pickle、py3k.py 等,所以这很有意义。谢谢克里斯蒂安!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 2019-11-24
    相关资源
    最近更新 更多