在我正在查看的某些代码中,有以下语句:
from math import exp, sqrt, ceil
但是,项目文件夹中没有名为 math 的文件夹,也没有名为 exp、sqrt 和 ceil 的模块。我的问题基本上是这些模块是从哪里导入的,我如何查看它们和其他类似的文件?提前致谢。
你有一些混淆的术语。在这种情况下,math
是模块,exp, sqrt, ceil
是它定义的函数。通常是from <module> import <function/class>
。math
是一个基本模块,它包含在每个 Python 安装中。Python 有一组特定的位置来查找模块。在这种情况下,math
将是一个用 C 编写的动态加载模块。
您可以通过以下方式找出它的来源:
import math
math.__file__
但是请注意,这将对解释器中内置的任何内容产生错误。
您看到的是Python 标准库。它们是通过在PYTHONPATH中搜索匹配的模块来解决的。除了 PYTHONPATH,您还可以从包含名为的文件的 python 脚本的任何子文件夹导入__init__.py
该math
模块是 Python 标准库的一部分,在任何 Python 安装中始终可用。但是,由于这些函数不是内置函数,因此确实需要导入它们。
当导入名为 spam 的模块时,解释器首先搜索具有该名称的内置模块。如果没有找到,它会在变量 sys.path 给出的目录列表中搜索名为 spam.py 的文件。sys.path 从这些位置初始化:
- The directory containing the input script (or the current directory).
- PYTHONPATH (a list of directory names, with the same syntax as the shell variable PATH).
- the installation-dependent default.
初始化后,Python 程序可以修改 sys.path。包含正在运行的脚本的目录位于搜索路径的开头,位于标准库路径之前。这意味着将加载该目录中的脚本,而不是库目录中的同名模块。除非打算更换,否则这是一个错误。有关详细信息,请参阅标准模块部分。
在 shell 中,您可以键入以下内容以获取默认的 sys.path
>>> import sys
>>> print sys.path
['', '/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2', '/usr/lib/python2.6/lib-tk', '/usr/lib/python2.6/lib-old', '/usr/lib/python2.6/lib-dynload', '/usr/lib/python2.6/dist-packages', '/usr/lib/python2.6/dist-packages/PIL', '/usr/lib/python2.6/dist-packages/gst-0.10', '/usr/lib/pymodules/python2.6', '/usr/lib/python2.6/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.6/gtk-2.0', '/usr/local/lib/python2.6/dist-packages']