Python 导入表达式的差异?

Python 导入表达式的差异?,python,django,Python,Django,关于python中的import//from语句,我有一个问题 在my views.py文件(Project/App/views.py)中,我有一行: from django.views.generic import TemplateView, ListView 为什么我必须在这行中包括“django”?为什么仅仅指定通用文件所在的目录(视图)还不够?这是我在以前的许多纯python脚本中所做的工作,例如: from random import foo 以及我当前的django url.py

关于python中的import//from语句,我有一个问题

在my views.py文件(Project/App/views.py)中,我有一行:

from django.views.generic import TemplateView, ListView
为什么我必须在这行中包括“django”?为什么仅仅指定通用文件所在的目录(视图)还不够?这是我在以前的许多纯python脚本中所做的工作,例如:

from random import foo
以及我当前的django url.py文件。在这方面,我有:

from app.views import view
为什么我不需要进一步指定它,就像第一个例子中的“django”包含在路径规范中一样?为什么我不必这样写:

from project.app.views import view

谢谢大家!

python脚本可以看到指向全局默认位置的某些路径,如
站点包
dist包
(您可以在python目录树中找到这些目录,并且
随机
django
位于其中一个目录中)或由环境变量
PYTHONPATH
指定。通常,
PYTHONPATH
包含您的项目目录(实际上您可以在其中添加任何您想要的目录)。您的示例表明,包
django
以及
apps
random
位于这些路径中,而
project
不在其中。在python中,包由一个目录表示,该目录包含
\uuuu init\uuuu.py
文件以及一些表示模块的其他文件。现在,您可以使用示例中所示的相对路径从这些位置的包导入模块

欢迎来到Python导入系统的疯狂世界

为了进一步扩展弗洛伊德的答案,您遇到了Python语言中最容易混淆的部分之一:相对导入和绝对导入。虽然您给出的导入示例在语法上很好,但它们隐藏了一些幕后发生的复杂情况。运行时:

from django.views.generic import TemplateView, ListView
from project.app.views import view 
Python在PYTHONPATH中搜索名为django的包或模块(您可以通过类似于
print(sys.path)
的内容看到)。它最终会在您安装的库中找到一个。同样,当您运行时:

from django.views.generic import TemplateView, ListView
from project.app.views import view 
它搜索这些相同的路径,但在Python解释器当前正在执行的目录中查找项目包。然而,如果您安装了一个名为project的库,它怎么知道您实际上指的是哪一个呢?这通常通过使用绝对导入和显式导入(如果您打算像这样使用相对导入)来解决。如果希望在示例中更精确,可以使用
-指定要相对于当前模块导入它,如下所示:

from .project.app.views import view    
您甚至可以在中的示例中看到这一点

有关更多详细信息,请参阅关于该主题的