赞
踩
前言:在查看一些工程性代码的时候,总是会发现类似:
from .util import utils from . import datasets
- 1
- 2
这样的引用语句, 这让我比较困惑,所以趁这次机会,花点时间,好好整理一下相关的知识
- 包
- 模块
- 框架: 如何组织包和模块
python提供了包的概念,是一个有层次的文件目录结构,用于管理多个模块源文件。
包就是文件夹,这个文件夹下有__init__.py文件,并且该文件夹可以包括其他模块
多个相关联的模块组成一个包,以便于维护和使用,同时能有限的避免命名空间的冲突。
在导入一个包的时候,会先调用这个包的__init__.py文件
层次问题:从小到大
包和模块的作用:
编写好轮子,工具类,供其他模块进行使用
有效地对程序进行分解,方便代码的管理和维护
防止同一模块内命名重复的问题(module1.name, module2.name)
– from bilibili https://www.bilibili.com/video/av65157512?p=2
包和模块基本信息
__name__
__package__
__file__
__dict__
导入包/模块的方式:
常规导入:
__all__
变量对应的内容__init__.py
文件中找__all__
变量对应内容注意:
使用时,导入的对象应该是模块,而不是包
如果导入的是一个包,默认不会导入任何模块
解决方案:
在该包中的__init__.py
中导入所有需要的模块
以from 包/文件夹 import 模块/子包 的形式导入
from模块 import 资源名 的形式导入
遇到no module named xxx
import sys
sys.path.append('rc:\Desktop\xxx_dir')
import xxx
# 比较强硬的解决方法
模块查找顺序:
很多时候会遇见以下错误:
ValueError: attempted relative import beyond top-level package
这通常是由于相对引用的使用而出现的问题。
需要明确:
__name__
举个例子:
- rootdir
- subdir1
- __init__.py
- subfile1.py
- subdir2
- __init__.py
- subfile2.py
- test.py
test.py中调用subfile1.py的内容:
def print_mod1():
print('__name__: {}'.format(__name__))
print('__package__: {}'.format(__package__))
print('Import Successfully!')
输出为:
__name__: subdir1.subfile1
__package__: subfile1
Import Successfully!
所以这个相对位置就是相对于__name__
变量,比如:
一个点:.
就代表当前是subdir1
两个点:..
就不存在,就会报错beyond top-level package
, 这里的top-level package 也很容易理解,那就是当前的subdir1。
更多内容可以查看:https://www.cnblogs.com/jay54520/p/8438228.html
目录结构如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MxGWGhqT-1572158854183)(assets/1572056109473.png)]
__init__.py
·文件内容如下:
print('-'*5,"init for model folder",'-'*5)
models.py
文件内容如下:
def mm():
print("this is rootpkg/model/models/model")
print('__name__: {}'.format(__name__))
print('__package__: {}'.format(__package__))
__init__.py
·文件内容如下:
print('-'*5,"init for src folder",'-'*5)
source.py
文件内容如下:
def ss():
print("this is rootpkg/src/source/src")
print('__name__: {}'.format(__name__))
print('__package__: {}'.format(__package__))
__init__.py
·文件内容如下:
print('-'*5,"init for rootpkg folder",'-'*5)
main.py
文件内容如下:
from model import models
from src import source
from 模块/文件夹 import 具体某个python文件名
source.ss()
models.mm()
运行结果如下:
----- init for model folder -----
----- init for src folder -----
# 这两个是在import模块的时候执行的__init__.py文件
this is rootpkg/src/source/src
__name__: src.source
__package__: src
this is rootpkg/model/models/model
__name__: model.models
__package__: model
运行完以后会出现__pycache__
文件夹
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sBm0xUjp-1572158854184)(assets/1572056618738.png)]
运行成功,但是Tommy-Yu的最佳实践那部分没有直行通过,大家可以查看一下第一个reference的博客,如果有谁能跑通,欢迎联系我。(ps: 个人感觉这个博客没有讲的很清楚,实际运行确实会出错)
附:代码链接:https://github.com/pprp/studyNote/tree/master/python基础下两个例子,分别是RootPkg和python_dir
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。