【问题标题】:How to resolve the Circular import Error?如何解决循环导入错误?
【发布时间】:2020-11-01 07:54:54
【问题描述】:

我正在使用 Python 中的 phonenumbers 模块。我遇到了循环导入的问题。每当我从桌面位置 (C:\Users\AsadA\Desktop) 运行文件时,都会忽略此错误。但是,每当我尝试在特定文件夹(C:\Users\AsadA\Desktop\Python_projects\28-FindingTheNUMBER)中运行它时,它都会引发错误。请帮帮我!

示例代码:

import phonenumbers

from phonenumbers import geocoder

from phonenumbers import carrier

from phonenumbers import timezone

my_Num=phonenumbers.parse("SAMPLE_NUM")

print(geocoder.description_for_number(my_Num,'en'))

print(carrier.name_for_number(my_Num,'en'))

print(timezone.time_zones_for_number(my_Num))

错误:

Traceback (most recent call last):
  File "c:/Users/AsadA/Desktop/Python_projects/28-FindingTheNUMBER/phonenumbers.py", line 1, in <module>
    import phonenumbers
  File "c:\Users\AsadA\Desktop\Python_projects\28-FindingTheNUMBER\phonenumbers.py", line 2, in <module>
    from phonenumbers import geocoder
ImportError: cannot import name 'geocoder' from partially initialized module 'phonenumbers' (most likely due to a circular import) (c:\Users\AsadA\Desktop\Python_projects\28-FindingTheNUMBER\phonenumbers.py)

【问题讨论】:

    标签: python python-3.x import python-import importerror


    【解决方案1】:

    您可能将文件命名为 "phonenumber.py"。如果您在 python 中导入某些内容,请确保文件名与导入的文件不同。如果相同,则会产生错误。
    发生这种情况是由于与导入文件的名称冲突,因为导入的文件名也相同。如果发生这种情况,那么 python 总是优先考虑您正在工作的当前目录的文件。
    因此,假设您的代码如下所示。

    import xyz
    print(xyz.version)
    

    您的文件名为“xyz.py”。 Python 编译器现在看到有两个同名的文件“xyz.py”,一个在安装 python 的脚本文件夹中,另一个在我们正在工作的当前目录中。因此,python 编译器编译器选择要从您正在处理的当前目录导入的文件。
    因此,python 读取第一行 import xyz,它从当前目录导入文件,这意味着它再次导入该文件并开始读取它。在那里,第一行再次导入 xyz,然后再次在当前文件夹中导入 xyz,导致发生循环。
    这称为循环循环

    所以,简而言之,更改文件名可以解决问题。

    【讨论】:

      【解决方案2】:

      您正在使用“import phonenumbers”导入模块 phonenumbers,然后在接下来的几行中导入该模块内的相关定义。它们是多余的。

      固定代码:

      import phonenumbers
      
      my_Num=phonenumbers.parse("SAMPLE_NUM")
      
      print(phonenumbers.geocoder.description_for_number(my_Num,'en'))
      
      print(phonenumbers.carrier.name_for_number(my_Num,'en'))
      
      print(phonenumbers.timezone.time_zones_for_number(my_Num))
      

      或者是这样的:

      from phonenumbers import (
          parse,
          geocoder,
          carrier,
          timezone,
      )
      
      my_Num=parse("SAMPLE_NUM")
      
      print(geocoder.description_for_number(my_Num,'en'))
      
      print(carrier.name_for_number(my_Num,'en'))
      
      print(timezone.time_zones_for_number(my_Num))
      

      【讨论】:

      • 不工作? 仍然冲突一个错误:AttributeError:部分初始化模块'phonenumbers'没有属性'parse'(很可能是由于循环导入)
      • 您尝试过第二种解决方案吗?
      猜你喜欢
      • 2017-11-19
      • 2012-04-19
      • 2020-05-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 2021-05-23
      • 2020-03-07
      • 2022-09-22
      相关资源
      最近更新 更多