python快速倒包_Python 基础之import导包

本文详细介绍了Python中import的使用,包括基础的模块导入、from...import语句、导入包及其内部模块的方法,以及单入口模块的概念。通过实例演示了如何在不同层级和相对路径下导入模块,帮助理解Python的包管理和导入机制。
部署运行你感兴趣的模型镜像

首先需要将import内容建立一个大概如下层级的包:

21bfbec08c42d21eb7fe28b227efa582.png

以黑色框为第一级,蓝色框为第二级,棕色框为第三级,红色框为第四级

一.import 引入初识

首先在module.py写入代码如下:

xboy = "hsz"xgirl= "zero"

defdog():print("小狗喜欢啃骨头")defcat():print("这个小猫的名字叫做小花")classMyStu():

name= "Python"

print("hello python")print(__name__)if __name__ == "__main__":#如果是间接的被导入,下面的代码不执行

print("test")

然后在main.py写入代码并逐个运行:

1.import 引入

importmodule#请记住:当导入模块的时候,只需要一次即可,终身受益.不会出现重复导入的情况#模块.属性(变量)

res =module.xboyprint(res)#模块.函数(方法)

module.dog()#模块.类

print(module.MyStu().name)#使用别名调用模块当中的成员

importmodule as mprint(m.xboy)

m.cat()importsysprint(sys.path)"""#自定义模块,进行导包

'''

在导包的时候,系统默认先从sys.path 这个路径开始寻找,如果找不到,直接报错,

如果想要找到,把相应的路径插入到sys.path这个列表,系统自动寻找对应模块.

'''

import sys"""sys.path.append(r"F:/hsz/zero/ceshi_module/") #importabcdprint(abcd.ceshi001)

然后对上面的mian.py里的内容进行注释,往后添加如下代码进行一步步运行:

2.from...import 从哪里..引入...方法

#引入一个

from module importdog

dog()#引入多个

from module importcat,xgirl

cat()print(xgirl)#引入所有 * 代表所有

from module import *

print(xboy)#可以在引入的同事,起一个别名

from module importcat as c,xboy as wwprint(ww)

c()print(__name__,type(__name__)) #__main__

"""#返回模块名字的魔术属性 __name__

如果当前文件是直接执行的,就是主文件(主进程),返回__main__

如果当前文件是间接执行的,就是子文件(子进程),返回当前文件名(模块名)"""

if __name__ == "__main__" : #if "main" == "__main__" 条件不成立 , 下面的代码不执行,不导入

#__name__ == __main__ 用来做测试用的, 在被间接导入的时候,下面的代码不需要导入

print("test code")

3.学习导入包

先对a.py 写入代码:

ceshia = 10011ceshia2=10012ceshia3= 10013

对mypath.py写入代码:

defjoin():print("自定义join")

ceshimypath= "mypath2345678"

还有package1下的__init__.py

ceshi101 = 10111111

#__init__ 不是用来直接运行的,而是伴随包的初始化的.

#方法三调用时,打开进行测试.#from package1 import a#from package1 import mypath

然后对main2.py写入代码,一个方法一个方法进行运行

#文件就是一个模块,文件就是一个包#文件夹里面可以有很多文件,就相当于包中有很多的模块#如果想把包当成模块用,在创建一个__init__.py中进行定义#当引入一个包的时候,当前包下的__init__文件自动执行

importpackage1print(package1.ceshi101)#方法一

importpackage1.aprint(package1.a.ceshia)#方法二 (起别名)

importpackage1.a as paprint(pa.ceshia2)#方法三#print("======方法三=========")#print(package1.a.ceshia)#package1.mypath.join() # 类比os.path.join的用法

注意:方法三只有在用的时候才将注释去掉运行测试,为了不影响接下来的运行,运行完方法3后对其进行注释

4.from ..import语法

然后对main2.py接下来的运行做好准备,需要在个个包下的文件添加内容如:

/package2/pkgone/pkgone2.py 内容为:

ceshippone2 = "ceshione2"ceshippone22= "ceshione22"

/package2/pkg_module1.py内容为:

ceshim1 = "m1"

/package2/pkgtwo/pkgtwo1.py内容为:

ceshi222 =222ceshi2222= 222222

接下来是main2.py添加如下代码:

#引入package1包下 a模块中的ceshia2 属性

from package1.a importceshia2print(ceshia2)#引入的同事,起别名

from package1.mypath importceshimypath as cm,join as jprint(cm)

j()

## 引入 package2 包下的 pkgone 包下的 pkgone1 模块 ,顺便起别名ppp1

import package2.pkgone.pkgone1 as ppp1

print(ppp1.ceshippp)

对此代码块进行一 一测试

5.单入口模块(重要)

分模块不能单独进行调用,统一由主文件main进行调用

模块之间的互相嵌套导入使用相对路径实现

单入口文件必须和包在同一层级,包里面可以含有各种包和模块

#单入口模式主要是对子文件的内容进行测试,在/package2/pkgone/pkgone1.py文件下添加如下代码:

ceshippp = "测试pppone"ceshippp1= "测试pppone1"

#子文件,如果是单入口模块,不能直接执行,因为在这里都用的的相对路径

#1.

from . importpkgone2print(pkgone2.ceshippone22)

#2.from.pkgone2 importceshippone2print(ceshippone2)

#3.from .. importpkg_module1print(pkg_module1.ceshim1)

#4.from .. pkgtwo importpkgtwo1print(pkgtwo1.ceshi222)

#5.from ..pkgtwo.pkgtwo1 importceshi2222print(ceshi2222)""". 当前路径

.. 上一级路径

... 上一级的上一级

.... 上一级的上一级的上一级

..... (这里的点是无限的)

from .......................................... import 模块"""

最后是在main2.py进行测试,将pkgone1.py文件一行行注释后,然后分5次将注释打开进行测试,并查看结果,理解单入口模式的使用方法

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

<think>我们正在处理一个关于Python模块入的问题,特别是关于在`__init__.py`中使用`from 本地 import 本地模块`时出现错误的原因。根据用户提供的引用,问题可能涉及到相对入和绝对入,以及结构的设置。 用户引用的信息表明: 1. 在目录中添加`__init__.py`文件可以将目录标记为(package)[^1][^2]。 2. 在子目录中入模块时,可以使用`import 子目录.模块`的形式[^2]。 3. 相对入(如`from ..libs.some_lib import something`)在内部使用时,可能会遇到`ValueError: Attempted relative import beyond top-level package`错误[^3]。 因此,用户的问题可以理解为:为什么在`__init__.py`文件中使用类似`from . import module`或`from ..subpackage import module`这样的相对入会致错误? 下面我们将逐步分析原因: ### 1. **Python结构的基本要求** - 一个目录要被Python识别为,必须含`__init__.py`文件(即使为空)[^1][^2]。 - 可以嵌套,形成子,每个子目录下也需要`__init__.py`文件。 ### 2. **绝对入与相对入** - **绝对入**:使用完整的路径从根开始入。 ```python from mypackage.mysubpackage import mymodule ``` - **相对入**:使用点号(.)表示当前,两个点(..)表示父。 ```python from . import mymodule # 入当前下的模块 from ..subpackage import module # 入父下的子中的模块 ``` 相对入只能在内部使用,并且只能用于内部的模块。 ### 3. **在`__init__.py`中使用相对入的常见错误** - **错误1:相对入超出顶级(top-level package)** - 当运行一个脚本时,该脚本所在的目录会被视为顶级。如果尝试使用相对入超出这个顶级,就会报错[^3]。 - 例如,假设有目录结构: ``` myproject/ main.py mypackage/ __init__.py libs/ __init__.py some_lib.py components/ __init__.py code.py ``` 在`mypackage/__init__.py`中,如果我们想入`libs/some_lib.py`,使用: ```python from .libs.some_lib import something ``` 这是正确的,因为`.libs`表示当前(mypackage)下的子libs。 但是,如果我们在`components/code.py`中使用: ```python from ..libs.some_lib import something ``` 这就会尝试从`components`的父(即mypackage)中入`libs.some_lib`,这是允许的。 然而,如果我们直接运行`code.py`(作为主模块),那么Python就不再把`mypackage`视为一个(因为直接运行的脚本所在的目录不被视为的一部分),此时相对入`..libs`就会超出顶级(顶级变成了`components`所在的目录,即`mypackage/components`,而`..`试图回到`mypackage`,但`mypackage`此时不在搜索路径中),从而引发`ValueError`[^3]。 - **错误2:在非环境下使用相对入** - 如果我们的目录结构没有正确形成(例如缺少`__init__.py`),或者我们在外部执行脚本,那么相对入将无法工作。 - **错误3:在交互式环境中使用相对入** - 在交互式Python shell中,当前模块不是的一部分,因此相对入会失败。 ### 4. **解决方案** - **方案1:使用绝对入** 在`__init__.py`中,使用绝对入路径(从顶级开始)可以避免相对入的问题。例如: ```python from mypackage.libs.some_lib import something ``` 注意:这要求顶级(如`myproject`)必须在Python的模块搜索路径中(例如,通过设置环境变量`PYTHONPATH`,或者将顶级放在标准库路径下,或者在运行程序时确保当前目录是顶级的父目录)。 - **方案2:确保脚本在内正确运行** 如果希望运行内的某个模块(如`code.py`),可以使用`-m`选项来运行模块,这样Python会将其作为的一部分执行: ``` python -m mypackage.components.code ``` 这样,相对入就可以正常工作了。 - **方案3:避免直接运行内模块** 设计时,通常不直接运行内的模块,而是通过一个外部的入口脚本(如`main.py`)来内的模块。 ### 5. **示例验证** 以用户引用[^3]中的结构为例: ``` pkg/ __init__.py libs/ __init__.py some_lib.py components/ __init__.py code.py ``` 在`components/code.py`中,我们想入`libs/some_lib.py`,可以使用: ```python # 相对入(在内使用) from ..libs.some_lib import something ``` 但是,如果我们直接运行`code.py`(如`python code.py`),就会报错。因为此时`code.py`被作为主模块,而相对入`..`试图访问内容。 正确的运行方式应该是(在`pkg`的父目录下): ``` python -m pkg.components.code ``` 或者,在`pkg`的同级目录下创建一个入口脚本(如`main.py`): ```python from pkg.components import code # 然后调用code中的函数 ``` ### 6. **总结** 在`__init__.py`中使用相对入报错的原因通常有两个: - 相对入超出了顶级的范围(常见于直接运行内模块)。 - 结构不完整(缺少`__init__.py`)或运行环境不正确。 为了避免这些错误,建议: 1. 使用绝对入(从顶级开始的完整路径)代替相对入。 2. 确保在运行程序时,顶级Python的模块搜索路径中。 3. 使用`-m`方式运行内模块,或者通过外部入口脚本来调用。 引用[^3]中提到的相对入错误,就是因为直接运行了内模块(没有使用`-m`)致的。 §§相关问题§§ 1. 如何正确设置Python的模块搜索路径(PYTHONPATH)? 2. 在Python中,绝对入和相对入有什么区别? 3. 为什么在Python 3中相对入需要显式地使用点号(.)? 4. 如何将一个目录转换为Python命名空间(namespace package)? 5. 在大型项目中,如何组织结构以避免循环入? [^1]: 在目录中添加`__init__.py`文件可以将目录标记为。 [^2]: 在子目录中入模块时,可以使用`import 子目录.模块`的形式。 [^3]: 相对入在直接运行内模块时会致超出顶级的错误。</think>在 Python 的 `__init__.py` 文件中使用 `from 本地 import 本地模块` 入错误,通常是由于结构理解不当或入路径问题造成的。以下是主要原因和解决方案: ### 1. **结构未正确识别** - **问题**:Python 需要 `__init__.py` 文件将目录识别为,但仅靠它不能解决所有入路径问题。 - **验证方法**: ```python # 在 __init__.py 中打印当前路径 import os print(os.path.abspath(__file__)) ``` ### 2. **相对入超出顶级**(最常见问题)[^3] - **场景**:尝试从父入模块时(如 `from ..sub import module`) - **原因**:当直接运行子模块时,Python 将其视为顶级模块,`..` 会超出有效范围 - **错误示例**: ```python # 文件结构: # mypkg/ # __init__.py # utils.py # subpkg/ # __init__.py # module.py # 在 subpkg/module.py 中: from ..utils import helper # 直接运行会报错! ``` - **解决方案**: 1. 使用绝对入:`from mypkg.utils import helper` 2. 以模块方式运行:`python -m mypkg.subpkg.module` ### 3. **入路径配置错误** - **问题**:Python 搜索路径(`sys.path`)未含项目根目录 - **解决方法**: ```python # 在入口文件添加: import sys from pathlib import Path sys.path.append(str(Path(__file__).parent.parent)) ``` ### 4. **循环入问题** - **场景**:当 A 入 B 的同时 B 也入 A - **解决方案**: 1. 重构代码消除循环依赖 2. 在函数内部入 ```python # __init__.py def get_helper(): from .utils import helper # 延迟入 return helper ``` ### 正确入示例 ```python # 文件结构: # project/ # main.py # mypkg/ # __init__.py # utils.py # subpkg/ # __init__.py # module.py # 在 mypkg/__init__.py 中: from . import utils # 正确!相对入当前 # 在 subpkg/module.py 中: from mypkg import utils # 正确!绝对入 # 或 from .. import utils # 正确!但仅当以模块运行(python -m) ``` ### 最佳实践总结 1. **优先使用绝对入**:`from mypkg.subpkg import module` 2. **避免在模块内直接运行**:使用 `python -m package.module` 3. **检查 `sys.path`**:确保项目根目录在搜索路径中 4. **避免相对入超出顶级**:`from ..module` 仅在内有效 5. **使用 `__init__.py` 定义公共接口**: ```python # mypkg/__init__.py from .utils import public_func # 暴露给外部 ``` > 关键点:`__init__.py` 使目录成为,但入路径取决于运行方式和项目结构[^1][^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值