gpt4 book ai didi

python - 为什么Python会选择这个意想不到的模块来导入

转载 作者:行者123 更新时间:2023-12-02 11:55:07 25 4
gpt4 key购买 nike

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

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

令我困惑的是,enum.py 中的导入并未使用任何包名称来限定 types:

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

那么为什么Python要选择位于两级子包中的用户编写的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 导入:

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可以找到用户编写的types.py而不需要包名称。

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

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

最佳答案

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

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

关于python - 为什么Python会选择这个意想不到的模块来导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59431096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com