代码之家  ›  专栏  ›  技术社区  ›  Eliy Arlev

在python中导入模块时控制名称空间

  •  0
  • Eliy Arlev  · 技术社区  · 5 年前

    问题是,我创建了大约50个类,这些类是从主文件调用的,我不想重写所有这些类引用,并在每个类之前添加模块名。

    我试图通过1个包(令牌)访问所有这些类

    Main.py
    Tokens / 
       __init__.py
       Gen.py
       BuilltIns.py
    

    其思想是用所有类填充包名称空间,然后在Main.py内导入包

    __init__.py:
    from Gen import *
    from BuilltIns import *
    
    Main.py:
    from Tokens import *
    

    当我跑的时候 __init__ dir()

    然而,当我跑的时候 Main.py ,我得到错误消息:

    Traceback (most recent call last):
      File "../Main.py", line 1, in <module>
        from Tokens import *
      File "..\Tokens\__init__.py", line 1, in <module>
        from Gen import *
    ModuleNotFoundError: No module named 'Gen'
    

    1 回复  |  直到 5 年前
        1
  •  1
  •   a_guest    5 年前

    你应该使用 from Tokens.Gen import ... 自从 Tokens 包裹在哪里 Gen sys.path 指定导入期间要搜索的其他目录。

    或者,在 Tokens/__init__.py from .Gen import * (注意 . 之前 消息 relative import . 运行主脚本时,当前工作目录被添加到导入期间要搜索的路径中,因此 from Gen import ... 仅搜索默认位置(不包括 代币 相对的 到当前的一个。

    请注意,您可以在中定义类 __all__ from ... import * . 这样就不会在主脚本的命名空间中泄漏其他名称。