gpt4 book ai didi

python - 强制在 Python 中使用不一致的文件导入路径 (/Django)

转载 作者:太空狗 更新时间:2023-10-30 02:35:42 26 4
gpt4 key购买 nike

我最近在 Django (Python) 中导入时遇到了一些问题...最好使用文件图来解释:

- project/
- application/
- file.py
- application2/
- file2.py

project/application/file.py 我有以下内容:

def test_method():
return "Working"

当我尝试从上面导入方法时,问题出现在 project/application2/file2.py 中:

from application.file import test_method

通常有效,但有时无效。

from project.application.file import test_method

确实有效,但它违背了 Django 的可移植性指南,因为项目文件夹必须始终具有相同的名称。

我不介意,但事实是这个问题的发生不一致,大多数时候省略 project 没问题,但偶尔不会(据我所知,没有原因)。

我几乎可以保证我在做一些愚蠢的事情,但是有人经历过吗?将 project 放在所有相关导入的前面以保持一致会更好吗?老实说,project 文件夹名称不太可能改变,我只是希望事情尽可能遵循指导原则。

最佳答案

要导入以查找模块,它需要位于 sys.path 中。通常,这包括“”,因此它搜索当前目录。如果您从项目加载“应用程序”,它会找到它,因为它在当前目录中。

好的,这是显而易见的事情。令人困惑的一点是 Python 会记住加载了哪些模块。如果加载应用程序,则加载导入应用程序的 application2,模块“应用程序”已经加载。它不需要在磁盘上找到它;它只使用已经加载的那个。另一方面,如果您还没有恰好加载应用程序,它会搜索它——但找不到它,因为它不在加载它的目录(“.”)或其他任何地方路径。

这可能会导致奇怪的情况,即导入有时有效,有时无效;它仅在已加载时才有效。

如果您希望能够将这些模块作为“应用程序”加载,那么您需要安排将 project/附加到 sys.path。

(相对导入听起来相关,但 application 和 application2 似乎是单独的包——相对导入用于在同一包内导入。)

最后,一定要始终如一地将整个应用程序视为一个包,或者始终如一地将每个应用程序视为它们自己的包。不要混搭。如果 package/在路径中(例如 sys.path 包含 package/..),那么您确实可以执行“from package.application import foo”,但如果您随后也执行“from application import foo”,则有可能Python 没有意识到它们是同一件事——它们的名称不同,并且它们位于不同的路径——并最终加载它的两个不同的副本,这是你绝对不想要的。

关于python - 强制在 Python 中使用不一致的文件导入路径 (/Django),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1156515/

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