【Python】Python的模块与包和pycharm 引入爆红

模块与包

模块(moudle)
用户从逻辑(实现一个功能)上组织Python代码(变量、函数、类),布置就是 *.py 。文件是无力上组织方式"module_name.py",模块是逻辑上组织方式"module_name"。
包(package)
定义了一个由模块和子包组成的Python应用程序执行环境,本质就是一个有层次的文件目录结构(python2要求必须带有一个__init__.py文件)。
例如

import os # 导入os模块
import django # 导入django包
from django.db import models # 从django.db包中导入models模块

import

import其实就是找东西(模块和包),官方点叫做路径搜素。既然要找东西,那么首先就有一个问题,去哪里找。
答案是在sys.path下
在这里插入图片描述
所以我们要找的模块和包,只需要将它的根目录添加到sys.path中。
还有就是我们需要注意点的就是,代码的执行路径也会被自动加入到sys.path中。

pycharm import爆红

我刚开始用python打开自己拷贝的项目时,发现好多import爆红,引入文件不存在的情况。
但是项目其实是正常运行的,但是你会发现,你把引入的路径都改成从项目的根目录引入,pycharm就不会报错了,但是这样其实是很不合理的,是因为pycharm会自动将项目打开的根目录进行加入到path,所以不变红。接下来我举一个例子。

Project

--------A
-------------a.py
--------B
-------------b.py
c.py

具体就是我们这里 a.py 加入想引用c文件在pycharm 直接
import c
发现不报错,也正常运行,但是如果我们在命令行中运行
python a.py
会发现找不到模块c,就是因为pycharm是自动将项目根目录加进去的。
所以我们在用pycharm打开一个比较大的项目时,会发现有很多变红的,而且项目中使用的是sys.path.append()去将路径加进去。因为这种情况是因为在项目执行时加进去的,pycharm不识别,所以pycharm引入会有很多变红,但是我们的项目是可以正常用python命令运行,所以我们在更改包和模块引入时,必须要注意pycharm的这种影响。

import 和 from … import 的区别

import 模块:导入一个模块;注:相当于导入的是一个文件夹,是个相对路径。
from…import:导入了一个模块中的一个函数;注:相当于导入的是一个文件夹中的文件,是个绝对路径。

所以
from…import *:是把一个模块中所有函数都导入进来; 注:相当于:相当于导入的是一个文件夹中所有文件,所有函数都是绝对路径。
结论:
from…import *语句与import区别在于:
import 导入模块,每次使用模块中的函数都要是定是哪个模块。
from…import * 导入模块,每次使用模块中的函数,直接使用函数就可以了;注因为已经知道该函数是那个模块中的了。

__init__.py的作用

__init__.py 主要是用来初始化 Python 包(packages)的,它在模块加载最开始运行。
举例说明
已下是包结构

├─test                                    
│  ├─package_1
│  │  ├─__init__.py 
│  │  ├─m1.py    
│  ├─package_2  
│  │  ├─__init__.py 
│  │  └─m2.py
│  ├─test.py

如上目录结构,如果两个包中的__init__.py 都为空的话,默认在 test.py 中我们只能执行如下

from package_2 import m2

print(m2.m2s())

如果没有__init__.py这个,上面那个直接报错找不到 package_2,并且import package_2 也是报错的。所以结合我们上面讲得__init__.py的作用就是将整个包支持那种引用。

进阶学习:
当想要执行

import package_2
print(package_2.m2.m2s())

from package_2 import *
print(m2.m2s())

即使有__init__.py也还会报错。这是因为在__init__.py 中并没有进行包提升
此时以 package_2 包中的__init__.py 为例
当我们在包中提升导入权限即可:

from package_2.m2 import m2s

在 test.py 中,执行

from package_2 import m2s
print(m2s())

通常我们经常还会遇到 from xxx import *
我们只需要在 init.py 中加载 all 允许全部导出的模块即可,如在 package_2 的 init.py 中加入

__all__ = ['m2']

test.py 中执行

from package_2 import *
print(m2.m2s())

__all__ 是一个列表变量,放的是你希望导入的模块的名字。
当 __init__.py 中定义了 __all__ 变量时,import * 只能导入 __all__允许的模块

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值