如果import语句只包含文件名,python如何找到模块文件?
Posted
技术标签:
【中文标题】如果import语句只包含文件名,python如何找到模块文件?【英文标题】:How does python find a module file if the import statement only contains the filename? 【发布时间】:2013-02-21 12:30:12 【问题描述】:我到处都能看到 Python 代码使用 import sys
或 import mymodule
导入模块
如果没有提供目录或路径,解释器如何找到正确的文件?
【问题讨论】:
在控制台输入help("import")
,尽情享受吧。
effbot.org/zone/import-confusion.htm
import
statement
请注意,此处显示的所有内容都是简化模型。导入机制相当复杂,尽管它对于纯 Python 代码并不重要。并且由于至少有一个版本,因此可以更彻底地自定义导入机制(例如,有一个小模块使import
从 Github 下载最新版本并安装它!)这反过来又使整个故事更加复杂。
@DSM - 酷!我知道help()
命令可以用于获取模块、类和函数的帮助,但我从未意识到它也可以为您提供关键字方面的帮助!
【参考方案1】:
http://docs.python.org/3/tutorial/modules.html#the-module-search-path
6.1.2。模块搜索路径
当导入名为
包含输入脚本的目录(或未指定文件时的当前目录)。spam
的模块时,解释器首先搜索具有该名称的内置模块。如果未找到,它将在变量sys.path
给出的目录列表中搜索名为spam.py
的文件。sys.path
从这些位置初始化:PYTHONPATH
(目录名称列表,语法与 shell 变量PATH
相同)。 依赖于安装的默认值。注意:在支持符号链接的文件系统上,包含输入脚本的目录是在符号链接之后计算的。换句话说,包含符号链接的目录不会添加到模块搜索路径中。
初始化后,Python程序可以修改
sys.path
。包含正在运行的脚本的目录位于搜索路径的开头,位于标准库路径之前。这意味着将加载该目录中的脚本,而不是库目录中的同名模块。除非打算更换,否则这是一个错误。有关详细信息,请参阅标准模块部分。
有关“特定于安装的默认设置”的信息,请参阅the site
module 上的文档。
【讨论】:
site
模块是我正在寻找的机器人。我一直想知道一个特定的 Python 实例如何“知道”事情应该在哪里(除了 CWD 文件以及您附加到 sys.path
的任何内容。我喜欢拉开这样的帷幕。谢谢!
我尝试这样做是为了在我的 GitHub 操作中缓存一些先决条件,虽然这个答案是正确的,但我对在 PYTHONPATH
变量中设置的确切内容感到困惑。在我的例子中,我将模块安装到 /tmp/opt
(用于缓存目的)并且必须将 PYTHONPATH
设置为 /tmp/opt/lib/python3.6/site-packages
才能正常工作。
实际的导入系统比本教程的这一部分建议的要复杂得多。答案掩盖了sys.meta_path
,它可以在 Python 中完全自定义,而这种PathFinder
行为通常是最后阶段(默认情况下它是元路径的最后一个元素)。【参考方案2】:
另外,您可以使用sys
模块查看当前路径是什么
import sys
print(sys.path)
【讨论】:
【参考方案3】:它使用设置为环境变量的PYTHONPATH 来查找包(包含__init__.py
文件的文件夹)和模块(或者,如果已经加载过一次,则从sys.modules
检索模块对象)。
【讨论】:
谢谢!顺便问一下,原则上允许使用绝对路径还是相对路径?我会在 10 分钟内接受 您可以使用其中任何一种,但为了代码的清晰,通常首选绝对值。 不太正确。PYTHONPATH
只是增加了 sys.path
,在大多数正常情况下(从站点包目录导入的模块),env var 甚至不需要存在。【参考方案4】:
Python 有一个路径变量,就像您在终端中的那个变量一样。 Python 在该路径内的文件夹或程序所在的文件夹中查找模块。
【讨论】:
以上是关于如果import语句只包含文件名,python如何找到模块文件?的主要内容,如果未能解决你的问题,请参考以下文章