如果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 sysimport 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如何找到模块文件?的主要内容,如果未能解决你的问题,请参考以下文章

5-4模块和包

Java-basic-2-

python 之 模块

python模块异常

如何使用'from ... import ...'语句导入带有两个文件的python包

python之路---模块与包