Python为什么选择要导入的此意外模块

问题描述 投票:1回答:1

我正在一个项目中,该项目的用户编写的模块名为types.py,该模块埋在第二层程序包中(其从项目根目录开始的路径为package/subpackage/types.py。]

这会引起问题,因为Python库还具有types模块。当另一个Python库模块enum.py尝试导入types时,将改为导入用户编写的版本,从而造成严重破坏。

令人不解的是,enum.py内部的导入不符合types的任何软件包名称:

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

那么Python为什么要选择用户编写的types,它位于两级子包中?在我看来,用户编写的types仅在使用时会被导入

# what I expect an 'import' would have to be like to access the user-written types.py
from package.subpackage.types import ...

[另一个可能的解释是,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模块的导入?

UPDATE:第一个注释表明发生了这种情况,因为我的项目的路径是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

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

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

现在的问题是sys.path为什么附加package/subpackage目录。我在代码中搜索了所有出现的sys.path,即使在某些时候将当前目录附加到了它,也从来没有package/subpackage目录。这可能在哪里发生?

python package python-packaging
1个回答
0
投票

不确定这是否算是真正的答案,因为不可能仅根据问题信息来回答(并且将所有详细信息添加到问题中是不切实际的)。无论如何,这是解决方案。

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

© www.soinside.com 2019 - 2024. All rights reserved.