Python模块引用

Python模块引用有两种方法

绝对路径引入

Python 在搜索模块时,依次搜索sys.path里的位置,直到找到模块为止。

sys.path
官方文档说明:A list of strings that specifies the search path for modules. Initialized from the environment variable PYTHONPATH, plus an installation-dependent default.

sys.path 初始化的时候有两部分:os.environ[‘PYTHONPATH’] 和 默认的安装依赖的一些路径(例如 python 安装的根目录 和 pythonxx.zip),是python的搜索模块的路径集,是一个list

下面命令可以查看当前的搜索路径:

import sys
print(sys.path)
输出:

C:\Users\Administrator\Desktop\pythontest
C:\Python27\Lib\idlelib
C:\Windows\system32\python27.zip
C:\Python27\DLLs
C:\Python27\lib
C:\Python27\lib\plat-win
C:\Python27\lib\lib-tk
C:\Python27
C:\Python27\lib\site-packages

以上输出是python的sys.path的路径列表,它是一个list。默认情况下python导入文件或者模块的话,他会先在sys.path里找模块的路径。如果没有的话,程序就会报错。

PYTHONPATH
如果我们使用 PYTHONPATH 中的 modules,那么在运行 python 前,就要把 path 加到 os.environ[‘PYTHONPATH’],在运行 python 后再加,那些模块不能直接被导入

而且当前脚本的路径默认会在这个list里面,比如:C:\Users\Administrator\Desktop\pythontest。所以当前脚本import 模块(通常是脚本文件),如果是这个脚本当前目录的情况下,是不会报错的(报错信息:找不到模块)。

sys.path的初始值来源于两个。一个是系统的PYTHONPATH变量,因此可通过设置该变量,来设置 Python 默认的搜索位置。比如:

export PYTHONPATH=/opt/python:$PYTHONPATH
echo $PYTHONPATH
将该命令放在系统初始化脚本(/etc/environment)或者 BASH 初始化脚本(~/.bashrc)里,可以对每个新开的窗口有效。

sys.path的另一个来源是当前执行程序所在的目录 (而不是当前目录)。比如当前目录下文件夹./cc下有一个b.py,那么执行./cc/b.py时,./cc(而不是./!)将被加到sys.path:

python ./cc/b.py

相对路径引用

上面说的是搜索模块都是指绝对路径引用。对于非系统目录,就需要操纵sys.path。但操纵sys.path有外溢效果,因为它是一个全局变量。对于同一个库里的模块的互相引用,可以考虑使用相对路径:

from . import abc
from .abc import fool
from …up import foo
但相对路径有两个很恶心的问题,使得用法极为受限。其中一个是:

Note that both explicit and implicit relative imports are based on the name of the current module. Since the name of the main module is always main, modules intended for use as the main module of a Python application should always use absolute imports.

包含相对路径 import 的 python 脚本不能直接运行,只能作为 module 被引用。原因正如手册中描述的,所谓相对路径其实就是相对于当前 module 的路径,但如果直接执行脚本,这个 module 的 name 就是__main__, 而不是 module 原来的 name , 这样相对路径也就不是原来的相对路径了,导入就会失败。

在使用相对引用的文件中,不能有 main 方法,只执行作为一个 module 进行引用,而不是直接执行脚本。

举个简单例子。假设./cc/目录下已有一个./cc/b.py(内容为空)。当前目录下的./a.py内容为:

from .cc import b
那么直接运行python ./a.py将会报错:

ModuleNotFoundError: No module named ‘main.cc’; ‘main’ is not a package
另一个是常见的错误是: ValueError: attempted relative import beyond top-level package。

注意不光是无法直接执行,imp.load_source以及用importlib.util实现的类似功能,都无法导入这样的文件模块。因此相对引入在实际应用中使用极为受限。

Python 中,模块是一种组织 Python 代码的方式。它们是 Python 文件,可以包含函数、类和变量等。在编写大型 Python 应用程序时,模块可以使代码更加模块化、易于维护和重用。在本文中,我们将介绍 Python 模块引用。 ## 模块引用Python 中,要使用模块中的函数、类或变量,需要先引用模块Python 中的 `import` 关键字用于引用模块。例如,要引用 Python 标准库中的 `math` 模块,可以使用以下代码: ```python import math ``` 这将引用名为 `math` 的模块,使得我们可以使用 `math` 模块中的函数和变量。要使用模块中的函数或变量,可以使用以下语法: ```python module_name.function_name() # 或者 module_name.variable_name ``` 例如,在上面的 `math` 模块中,我们可以使用 `math.sqrt()` 函数来计算一个数字的平方根: ```python import math x = 16 print(math.sqrt(x)) # 输出:4.0 ``` ## 别名引用 有时候,模块名可能很长,或者我们不想使用长模块名来引用它。在这种情况下,我们可以使用别名来引用模块Python 中的 `as` 关键字用于指定别名。例如,我们可以使用以下代码来引用 `math` 模块并将其别名为 `m`: ```python import math as m ``` 这将使我们可以使用 `m` 来引用 `math` 模块中的函数和变量。例如: ```python import math as m x = 16 print(m.sqrt(x)) # 输出:4.0 ``` ## 只引用模块中的部分内容 有时候,我们只想引用模块中的部分内容,而不是整个模块。在这种情况下,我们可以使用 Python 的 `from` 关键字来引用模块中的特定内容。例如,如果我们只想引用 `math` 模块中的 `sqrt()` 函数,可以使用以下代码: ```python from math import sqrt ``` 这将只引用 `math` 模块中的 `sqrt()` 函数,而不是整个 `math` 模块。现在,我们可以直接使用 `sqrt()` 函数,而不需要使用 `math.sqrt()`: ```python from math import sqrt x = 16 print(sqrt(x)) # 输出:4.0 ``` 如果要同时引用多个函数或变量,可以使用逗号分隔它们。例如: ```python from math import sqrt, pi print(sqrt(16)) # 输出:4.0 print(pi) # 输出:3.141592653589793 ``` ## 引用模块中的所有内容 有时候,我们可能希望引用模块中的所有内容,而不需要使用模块名来访问它们。在这种情况下,我们可以使用 Python 的 `*` 运算符来引用所有内容。例如: ```python from math import * ``` 这将引用 `math` 模块中的所有函数和变量。现在,我们可以直接使用这些函数和变量,而不需要使用 `math.` 前缀: ```python from math import * x = 16 print(sqrt(x)) # 输出:4.0 print(pi) # 输出:3.141592653589793 ``` 值得注意的是,不建议使用 `*` 运算符引用模块中的所有内容,因为这可能会导致命名空间污染和变量冲突。最好只引用需要的部分内容,或者使用别名来引用模块
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值