python-学习 高级-包管理(包、模块、命名空间、压缩成exe)

一.模块(Module)和包(Package)

1.模块:一个包含所有你定义的函数和变量的文件,其后缀名是 .py ,一个.py文件就是一个模块
2.包:一定包含 init.py模块 的文件夹,一般也会包含其他一些模块和子包
3.库(lib):库是完成一定功能的代码集合,具体表现可以是包,也可以是一个模块
4.框架(framework):为解决一个开放性问题而设计的具有一定约束性的支撑结构
5.python内置了一些库,除此之外,还有其他人自己做的一些库,称之为第三方库
6.一般把第三方库放在…/python3/lib/site_packages中

二.第三方库的下载和安装

1.安装第三方库实质上是下载并使用别人写的代码
2.常见的第三方库的格式:源码(Source)(压缩包,需先解压,得到包含setup.py文件夹);egg(本质是压缩包);whl(本质也是压缩文件)
3.安装方式:
(1)源码安装(本地安装):手动下载,再安装到本地;
(2)包管理安装(远程安装):通过命令使自动化的为用户安装管理包和模块

安装一个库:
(1)pycharm中搜索安装
(2)命令行 pip install xxx
(3)如果上面都出现问题,https://www.lfd.uci.edu/~gohlke/pythonlibs/下载相应库到本地,命令行 pip install xxx.whl

三.导入模块和包

1.使用(from A )import B (as C) 的形式进行导入:从A导入B到当前位置,使用别名C。
(1)from 包 import 单个或多个模块
(2)from 模块 import 模块资源(比如:函数,属性等)
(3)要保证面向原则,即只能导入自己的下一级,不能从包中导入模块的资源或从大包中导入小包的模块
(4)import * 表示导入能匹配到的所有资源,存放在__all__=[ ](列表中每个元素都是字符串)
(5)import和from…import…不存在哪种更省内存,都创建了模块对象,区别在于把哪一部分内容拿到当前位置来用
(6)导入包时如果只写包名,默认不会导入所有模块,应在init模块中再次导入需要的模块或以from…import…的形式导入
2.导入时,需要把命令放在脚本的顶端
3.对同一库的导入只会被执行一次,不管你有多少个import。这样可以防止库被一遍又一遍地执行
4.导入模块时,会自动执行该模块;导入包时,会自动执行对应的init.py文件
5.执行import语句时会自动搜索,来确定该包或模块存在
(1)查找路径顺序是:内存中已经加载的模块 -> 内置模块 -> sys.path路径(导入模块的环境变量)中包含的模块
#导入包
import 同级包 #导入同级包直接导入

from … import 语句
from fibo import fib, fib2
from … import * 语句

把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明:

from modname import *
from . import manage
也支持as
from spam import read1 as read
一行导入多个名字
from spam import read1,read2,money

四.sys模块(与系统功能有关的模块)

1.sys.path一个目录列表,供Python从中查找第三方扩展模块

import sys
#sys.path获取指定模块搜索路径的字符串集合,可以将写好的模块放在得到的某个路径下,就可以在程序中import时正确找到
print(sys.path)
------------------------------------
import sys
#在外部向程序内部传递参数sys.argv
print(sys.argv[0])# 获取脚本名字
print(sys.argv)
for i in sys.argv:
    print(i)       # 获取参数列表
print(len(sys.argv)-1)# 统计参数个数

五.__name__属性

1.a模块被另一个程序第一次引入时,a模块主程序将运行
2.用__name__属性来使程序块仅在模块自身运行时执行,被引用时不执行
3.每个模块都有一个__name__属性,当其值是’main’时,表明该模块自身在运行,否则是被引入
4.一个py文件直接以脚本的形式进行执行,它的名字就是__main__;若是使用模块的形式进行加载的,他的名字是由加载的路径决定的:包名.子包名.模块名 顶级名称

def dayin():
    print('dayingg')
dayin()
if __name__ == '__main__':
   print('程序自身在运行')
else:
   print('我来自另一模块')
---------------------
dayingg
程序自身在运行
dayin.py
--------------------
 import dayin
 dayingg
# 我来自另一模块

六.dir() 函数

1.内置的函数 dir() 可以找到模块内定义的所有名称。以一个字符串列表的形式返回
2.如果没有给定参数,那么 dir() 函数会罗列出当前定义的所有名称

print(dir())

六.删除包

 pip uninstall xxx  如:pip uninstall pycurl

七 其他

|—包
|—|--- init.py 包的标志文件
|—|--- 模块1
|—|--- 模块2
|—|--- 子包(子文件夹)
|—|---|— init.py 包的标志文件
|—|---|— 子包模块1
|—|---|— 子包模块2

一个模块就是一个包含pytho代码的文件, 后n缀名成是.py就可以,模块就是个python文件
为什么我们要用模块
程序太大,编写维护非常不方便,需要拆分
模块可以增加代码重复利用的方式
当做命名空间使用,避免命名冲突
如何定义模块
模块就是一个普通文件,所以任何代码可以直接书写,
不过根据模块的规范,最好在模块中编写以下内容
函数(单一功能)
类(相似功能的组合,或者类似业务模块)
测试代码
如何使用模块

1、2、模块直接导入
假如模块名称直接以数字开头,需要借助importlib帮助
语法
案例 01,02,p01,p02
import module_name
module_name.function_name
module_name.class_name

3、import 模块 as 别名
导入的同时给模块起一个别名
其余用法跟第一种相同
案例 p03

4、from module_name import func_name, class_name
按上述方法有选择性的导入
使用的时候可以直接使用导入的内容,不需要前缀
案例 p04

5、from module_name import
导入模块所有内容
案例 p05

if name == "main 的使用
可以有效避免模块代码被导入的时候被动执行的问题
建议所欲程序的入口都以此代码为入口

.命名空间

用于区分不同位置不同功能但相同名称的函数或者变量的一个特定前缀
作用是防止命名冲突
setName()
Student.setName()
Dog.setName()

info = "Adress : "
def func_father(country):
    def func_son(area):
        city= "Shanghai " #此处的city变量,覆盖了父函数的city变量
        print(info + country + city + area)
    city = " Beijing "
    #调用内部函数
    func_son("ChaoYang ");
 
func_father("China ")
输出:Adress : China Shanghai ChaoYang
以上示例中,info在全局命名空间中,country在父函数的命名空间中,city、area在自己函数的命名空间中

将自己写的python文件压缩成exe有两种方法:
1、 首先,访问Pyinstaller的官网"pyinstaller.org"并下载Pyinstaller
1、一般下载完后Pyinstaller会添加到环境变量里。打开命令行输入命令:“pip install pyinstaller”
2、安装完后输入命令:"pyinstaller --version"检测是否安装成功,如安装成功则会显示版本号
3、 等待安装完毕。安装完后使用cd命令进入到.py文件所在的文件夹并且输入命令:“pyinstaller hello.py”,这里的hello替换为你的.py文件名字
4、 打包完打开.py文件所在目录,会看到一个名为dist的文件夹。打开文件夹,里面有打包完的程序
补充一下后来发现的问题,运行pyinstaller -F SliceFile.py后的exe打开时总是先有一个cmd窗口出现,要去掉的话应该用运行pyinstaller -F -w SliceFile.py

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值