导入表达式的差异?

2024-04-29 14:58:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个关于python中import//from语句的问题。你知道吗

在我的视图.py文件(项目/应用程序)/视图.py)我有一句话:

from django.views.generic import TemplateView, ListView

为什么我要把“django”包括在那一行?为什么仅仅指定泛型文件所在的目录(视图)是不够的?这是我以前在许多纯python脚本中所做的工作—例如:

from random import foo

以及我现在的django网址.py文件。在那里,我有:

from app.views import view

为什么我不进一步指定它,比如第一个示例中的路径规范中包含了'django'?为什么我不用这样写:

from project.app.views import view

谢谢你!你知道吗


Tags: 文件项目djangofrompyimportview视图
2条回答

欢迎来到Python导入系统的疯狂世界!你知道吗

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

from django.views.generic import TemplateView, ListView

Python在PYTHONPATH中搜索一个名为django的包或模块(可以用print(sys.path)之类的东西看到)。它最终会在您安装的库中找到一个。类似地,运行时:

from project.app.views import view 

它搜索那些相同的路径,而是在Python解释器当前执行的目录中找到项目包。但是,如果您安装了一个名为project的库,它怎么知道您实际上指的是哪一个呢?这通常是通过使用绝对导入来解决的,如果您打算像这样使用相对导入,则通过显式来解决。如果您想在示例中更精确一些,您可以指定要使用.将其相对导入当前模块,如下所示:

from .project.app.views import view    

您甚至可以在django tutorial中的示例中看到这一点。你知道吗

请参阅this classic answer了解更多详细信息。你知道吗

python脚本可以看到指向全局默认位置的某些路径,如site-packagesdist-packages(您可以在python目录树中找到这些目录,randomdjango位于其中一个目录中),或者由环境变量PYTHONPATH指定。通常,PYTHONPATH包含您的项目目录(实际上,您可以在那里添加您想要的任何目录)。您的示例表明包django以及appsrandom位于这些路径中,而project不在那里。在python中,包由包含__init__.py文件的目录以及表示模块的一些其他文件表示。现在,您可以使用相对路径(如示例中所示)从这些位置的包导入模块。你知道吗

相关问题 更多 >