python - 为什么 Python 会选择这个意想不到的模块来导入
问题描述
我正在处理一个项目,该项目有一个用户编写的模块,称为types.py
埋在二级包中(它从项目根目录的路径是package/subpackage/types.py
)。
这会导致问题,因为 Python 库也有一个types
模块。当enum.py
另一个 Python 库模块尝试导入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
解释用户编写的模块的导入呢?
更新:第一条评论表明发生这种情况是因为我的项目路径是sys.path
. 但是,我建立了一个非常简单的项目,其中一个名为的模块mymodule
位于package.subpackage
:
在不使用包和子包名称的情况下导入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
更新 2:打印出更多信息,我看到当我一开始打印sys.path
时enum.py
(我修改了标准库文件以打印它),我看到package/subpackage
目录在中sys.path
,即使它不是在执行开始时。所以这解释了为什么使用用户编写typos.py
的。
现在的问题是为什么sys.path
附加package/subpackage
目录。我在我的代码中搜索了所有出现的sys.path
,即使当前目录在某些时候附加到它,它也永远不是package/subpackage
目录。这会发生在哪里?
解决方案
不确定这是否算作一个真正的答案,因为不可能根据问题信息本身来回答它(并且将所有细节添加到问题中是不切实际的)。无论如何,这是解决方案。
基本上,经过更深入的检查,我发现一个脚本调用另一个脚本作为外部进程,而后一个脚本位于package/subpackage
目录中,该目录被添加到sys.path
新进程中。关于最后一点,我不知道为什么;我假设脚本的当前目录总是添加到sys.path
.
推荐阅读
- javascript - 如何更改 iframe src 中的 DOM 元素(背景颜色)?
- javascript - 以覆盖模式从剪贴板粘贴 - 输入光标移动到文本节点的末尾
- java - 如何在我的 HashMap 中找到未知键的值并将其转换为 int?
- security - 我需要 MD5 作为 SHA-1 的伴侣吗?
- asp.net-mvc - 使用多个搜索框在 Asp.net(实体框架)中进行多重搜索
- python - 如何加入两个 Spark 结构化流?
- javascript - 通过操作 CSS 文件和我的 Javascript 文件仅显示具有特定 id 的 div
- c++ - 内存地址在 8 位后被截断
- r - r 国家和部门的总值
- reactjs - 为什么我的 POST 请求会导致 404 错误?