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

2024-05-13 02:44:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经把我写的一个项目从一个文件分为几个文件 问题是,我创建了大约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()显示所有类名都被导入到包namepace

但是,当我运行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'

如何从Main.py中提取60多个类到其他模块,而不重写这些类的所有调用


Tags: 模块文件项目infrompyimportinit
1条回答
网友
1楼 · 发布于 2024-05-13 02:44:57

您应该使用from Tokens.Gen import ...,因为TokensGen模块所在的包。导入路径应该相对于主脚本,除非修改了sys.path以指定导入期间要搜索的其他目录

或者,在Tokens/__init__.py中可以执行from .Gen import *(注意.前面的Gen)。这表示relative import。运行主脚本时会发生的情况是,当前工作目录被添加到导入期间要搜索的路径中,因此当遇到from Gen import ...时,只搜索默认位置(不包括Tokens目录)。通过使用相对导入,您可以告诉Python在哪里可以找到与当前模块相对的模块

请注意,您可以在^{}中定义类,以便约束在from ... import *期间导入的内容。这样就不会在主脚本的命名空间中泄漏其他名称

相关问题 更多 >