为什么Python选择这个意外的模块来imp

2024-04-25 13:36:33 发布

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

我正在处理一个项目,它在二级包中嵌入了一个名为types.py的用户编写模块(它从项目根目录的路径是package/subpackage/types.py)。在

这会导致问题,因为Python库还有一个types模块。{{cd4>导入模块时,{cd4>试图导入另一个模块。在

让我困惑的是,enum.py中的导入没有使用任何包名来限定types

# line 10 of enum.py:
from types import MappingProxyType, DynamicClassAttribute

那么,Python为什么要选择用户编写的types,它在两级子包中?在我看来,只有当用户使用

^{pr2}$

另一种可能的解释是sys.path包含package/subpackage目录,但当我在enum.py import之前打印其内容时,情况并非如此:

enum.py: Path:
/home/me/PycharmProjects/myproject
/home/me/anaconda3/envs/myproject/lib/python37.zip
/home/me/anaconda3/envs/myproject/lib/python3.7
/home/me/anaconda3/envs/myproject/lib/python3.7/lib-dynload
/home/me/anaconda3/envs/myproject/lib/python3.7/site-packages

那么,如何解释用户编写的types.py模块的导入?在

更新:第一条注释表明发生了这种情况,因为我的项目路径是sys.path中的第一项。但是,我建立了一个非常简单的项目,其中名为mymodule的模块位于package.subpackage中:

Sandbox Project

mymodule导入而不使用包和子包名称将不起作用:

# main.py
# Works:
from package.subpackage.mymodule import my_module_field

# Does not work:
# from mymodule import my_module_field

所以我仍然不明白为什么enum.py中的from types import可以在没有包名的情况下找到{}编写的用户。在

更新2:打印出更多信息时,我看到当我在enum.py开始打印sys.path(我修改了标准库文件以打印它),我看到package/subpackage目录sys.path,即使它不是在执行的开始。这就解释了为什么要使用用户编写的typos.py。在

现在的问题是为什么sys.path附加了package/subpackage目录。我搜索了代码中所有出现的sys.path,即使当前目录在某些时候被附加到它后面,它永远不是{}目录。这会发生在哪里?在


Tags: 模块path项目用户pyimportpackagehome
1条回答
网友
1楼 · 发布于 2024-04-25 13:36:33

不确定这是否算是一个真正的答案,因为它不可能根据问题本身的信息来回答它(将所有细节添加到问题中是不切实际的)。无论如何,这是解决办法。在

基本上,经过进一步的检查,我发现一个脚本调用另一个脚本作为一个外部进程,后一个脚本位于package/subpackage目录中,该目录被添加到新进程的sys.path中。关于最后一点,我不确定为什么;我假设脚本的当前目录总是添加到sys.path。在

相关问题 更多 >