Python编程基础与应用第13章 虚拟环境与程序打包发布_第1页
Python编程基础与应用第13章 虚拟环境与程序打包发布_第2页
Python编程基础与应用第13章 虚拟环境与程序打包发布_第3页
Python编程基础与应用第13章 虚拟环境与程序打包发布_第4页
Python编程基础与应用第13章 虚拟环境与程序打包发布_第5页
已阅读5页,还剩30页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第

13

章

虚拟环境与程序打包发布XXXX

大学

XX

学院XXX

教授2学习目标:掌握使用标准库venv

创建虚拟环境的方法掌握模块、包与库的构建与发布方法掌握将Python

文件打包成exe

文件的方法思政内涵:通过对程序打包发布的学习,体会软件资源分享的快乐,广大学子要树立乐于奉献的精神。第

13

章

虚拟环境与程序打包发布313.1 Python

虚拟环境使用Python

开发项目免不了要安装各种包。我们安装的所有包都会被安装到同一个目录中供Python

调用。当两个

Python

项目用到同一个包的不同版本或一个新项目需要用到的包会影响以前已经完成调试的项目的开发环境时,Python

开发环境就会出问题。虚拟环境可以解决以上问题,它会为每一个Python

项目创建一个隔离的开发环境,每个开发环境所安装的包和依赖相互独立,可以确保项目的开发环境互不干扰。每个项目都有一个独立的虚拟环境(virtual

environment)。虚拟环境并不是什么新技术,主要是利用了操作系统中环境变量以及进程间环境隔离的特性,从计算机中独立开辟出来的一个虚拟化环境,可以将这部分独立环境视为一个容器,在这个容器中可以只安装需要的依赖包,各个容器之间互相隔离、互不影响。在激活虚拟环境时,激活脚本程序会将当前命令行4程序的

PATH

修改为虚拟环境的路径,这样执行命令就会在被修改的

PATH

中查找,避免了原本

PATH

可以找到的命令,从而实现了

Python

环境的隔离。Python

3.3

之后的版本自带标准库venv,可以利用其创建虚拟环境。第三方工具也可以创建虚拟环境,如

virtualenv、pipenv、anaconda

等。本节将学习如何使用标准库venv

创建虚拟环境。13.1.1 虚拟环境的创建在Windows

的命令行模式下,标准库venv

创建虚拟环境的命令格式如下。python-mvenv

/path/env_name运行此命令将创建目标目录(父目录若不存在也将创建),并放置一个pyvenv.cfg

文件在其中,该文件中有一个

home

键,它的值指向运行此命令的

Python

安装(目标目录的常用名称是.venv)。它还会创建一个Scripts

子目录,其中包含Python

二进制文件的副本或符号链接(视创建环境时使用的平台或参第

13

章

虚拟环境与程序打包发布5数而定)。它还会创建一个初始为空的lib\site-packages

子目录。创建虚拟环境的步骤如下。在D

盘根目录创建myenvs

目录,用于保存虚拟环境。在

Windows

的命令行模式下,

执行命令:

python

-m

venvd:/myenvs/myenv1。执行以上命令后,D

盘myenvs

目录下创建的虚拟环境myenv1

如图

13.1所示。图

13.1虚拟环境myenv1

内容6如果要创建指定Python

版本的虚拟环境,首先要安装相应版本的Python,然后找到其安装目录,在安装目录下执行虚拟环境创建命令,这样就完成了指定版本Python

虚拟环境的创建,步骤如下。安装指定版本Python

环境。本书安装的是Python

3.11

版本。在Windows

的命令行模式下,执行py

-0p

或where

python

命令,输出各个版本的Python

安装路径列表。在

指

定

版

本

安

装

路

径

下

,

执

行

命

令

:

python -m venvd:/myenvs/myenv311。执行以上命令后,D

盘myenvs

目录下创建的虚拟环境myenv311

如图13.2

所示。第

13

章

虚拟环境与程序打包发布7图

13.2 虚拟环境myenv311

内容虚拟环境的使用虚拟环境的激活首先在Windows

下运行cmd.exe(或powershell)程序进入命令行模式,然后在虚拟环境的指定文件夹

Scripts

下运行命令

activate.bat(

或activate.ps1),当命令提示符内的指针前方增加了虚拟环境名称时,说明成功激活进入了虚拟环境,如图

13.3

所示。8图

13.3 激活并进入虚拟环境myenv311在虚拟环境下安装包例如,当要进行

Web

应用程序的开发时,首先要安装

Web

框架(Flask

等),在激活的虚拟环境下执行命令:pip

install

flask。执行命令后,site-packages目录下就增加了Flask

框架的相关文件。查看虚拟环境下安装的包在虚拟环境下,执行命令:pip

list。执行命令后会显示虚拟环境下已经安装的包信息,如图

13.4

所示。第

13

章

虚拟环境与程序打包发布9图

13.4 虚拟环境下已经安装的包信息4.

保存和复制虚拟环境在虚拟环境下,执行命令:pip

freeze。执行命令后会以

requirements

文件格式显示虚拟环境下已经安装的包信息,如图

13.5

所示。10图

13.5

requirements

文件格式显示包信息在虚拟环境下,执行命令:pip

freeze

>

requirements.txt。执行命令后将已安装的包信息存入requirements.txt

文件中,这样就保存了虚拟环境。把

requirements.txt

文件复制到其他虚拟环境下,然后在激活虚拟环境下执行命令:pip

install-r

requirements.txt。执行命令后就复制了与原来一样的虚拟环境。第

13

章

虚拟环境与程序打包发布115.

退出虚拟环境在虚拟环境下,执行命令:deactivate。执行命令后即可退出虚拟环境。6.

改变虚拟环境所指向的实际Python

环境用记事本打开虚拟环境下的配置文件pyvenv.cfg,将

home

后面的路径改为实际Python

环境的python.exe

文件路径即可,如图

13.6

所示。图

13.6改变虚拟环境的指向127.

删除虚拟环境通过Windows

命令直接删除虚拟环境目录即可删除虚拟环境。虚拟环境的结构实际环境实际环境结构如图

13.7

所示。lib

目录下有第三方库的安装目录site-packages

和标准库,python.exe

解释器文件与pip.exe

等其他文件不在一个目录下。图

13.7实际环境结构第

13

章

虚拟环境与程序打包发布132.

虚拟环境虚拟环境结构如图

13.8

所示。虚拟环境中没有标准库的内容,应用中与实际环境共用标准库。虚拟环境的

python.exe

解释器文件与pip.exe

等其他文件均在scripts

目录下。图

13.8 虚拟环境结构

13.2 程序打包与发布Python

的软件包一开始没有官方的标准分发格式,后来不同的工具开始引入一些比较通用的归档格式,但是这些格式都不是官方支持的,存在元数据和14包结构彼此不兼容的问题。为解决这个问题,PEP427

定义了新的分发包标准,名为Wheel

标准。pip

等打包工具都支持这个标准。Python

程序打包一方面是构建成Python

库;另一方面是打包成

exe

可执行文件。虽然库是

Python

中常常提及的概念,但事实上

Python

中的库只是一种对特定功能集合的统一说法,而非严格定义。Python

库的具体表现形式为模块(module)和包(package),Python

库的构建工具有很多,如

distutils、setuptools

等。将

Python

文件打包成

exe

文件也有多种工具可以选择,如PyInstaller、py2exe

等。下面先介绍模块和包的构建,然后介绍distutils

和PyInstaller

打包工具的使用,并介绍如何发布第三方库。13.2.1 模块的构建与使用Python

模块本质上是一个包含Python

代码的.py

文件,模块名就是文件名。假设现有文件demo.py,该文件中包含程序段P13.1。第

13

章

虚拟环境与程序打包发布15P13.1

demo.pydefadd(x,y):return

x+y那么demo.py

就是一个Python

模块。利用import

语句或form-import

语句在当前程序中导入模块,便可在当前程序中使用模块内包含的代码。例如,在当前程序中使用demo

模块中定义的add()函数,示例代码如程序段P13.2

所示。P13.2

导入

demo

模块示例importdemores=test.add(11,22)print(res)运行代码,输出结果如下。1633模块既能被导入其他程序中使用,也可以作为脚本直接使用。实际开发中,为了保证模块实现的功能与预期相符,开发人员通常会在模块文件中添加一些测试代码,对模块中的功能代码进行测试。以

demo.py

文件为例,示例如程序段P13.3

所示。P13.3

模块测试def

add(x,y):return

x+yif

name

==

'

main

':res=

add(11,22)print("函数

add(x,y)测试:x+y=%d"%res)当解释器直接执行以上文件时,便可执行文件中if

语句后面的测试代码,第

13

章

虚拟环境与程序打包发布17测试add()函数的功能。如果在其他文件中把以上文件作为模块导入,则不会执行测试代码。这个测试设计利用了模块的

name

属性,当模块作为主模块运行时,

name

取值为“

main

”,当模块不作为主模块运行时,

name

取值为“模块名”。所以,代码中的条件语句只有在模块是主模块运行时才执行测试代码。这样既达到了测试模块功能的目的,又不影响模块的使用。13.2.2 包的构建与使用当一个项目中有很多个模块时,就需要再进行组织。将功能类似的模块放到一起就形成了包。本质上,包就是一个包含

init

.py

文件的文件夹,如图13.9

所示。18图

13.9 package

包结构包下面可以包含模块,也可以再包含子包(subpackage),就像文件夹中可以有文件,也可以有子文件夹一样,如图

13.10

所示。(a)

package

包结构图

13.10(b)

package_a

子包结构包结构图在图

13.10

中,package

是上层的包,下面有一个子包

package_a,每个包中都有

init

.py

文件。假设导入模块demo_a1.py,3

种导入语句格式和使用语句格式分别如下。第

13

章

虚拟环境与程序打包发布19格式一:import

package.package_a.demo_a1。在使用时,必须加完整名称来引用:package.package_a.demo_a1.fun_a1()。格式二:frompackage.package_a

import

demo_a1。在使用时,可以直接使用模块名引用:demo_a1.fun_a1()。格式三:from

package.package_a.demo_a1

import

fun_a1。在使用时,可以直接使用函数名或类名引用:fun_a1()。当使用from

package

import

item

这种语法格式时,item

可以是包、模块,也可以是函数、类、变量。当使用

import

item1,

item2

这种语法格式时,item

必须是包或模块。导入包的本质其实是“导入了包的

init

.py”文件。也就是说,“importpackage”意味着执行了包package

下面的

init

.py

文件。

init

.py

有以下

3

个核心作用。(1)

作为包的标识,不能删除。20(2)

用来实现模糊导入。(3)

导入包实质是执行

init

.py

文件,可以在

init

.py

文件中进行包的初始化、统一执行代码、批量导入等操作。在package

包下的

init

.py

文件中写入代码如程序段P13.4

所示。P13.4

init

.py

文件import

mathprint("已导入

package

包")在package

包同级目录的demo.py

文件中写入代码如程序段P13.5

所示。P13.5

测试

init

.py

文件执行importpackageprint(package.math.pi)运行代码,输出结果如下。第

13

章

虚拟环境与程序打包发布21已导入

package

包3.141592653589793通过以上测试可以看出,Python

非常巧妙地通过

init

.py

文件将包转换成了模块的操作,因此,可以说“包的本质是模块”。库的构建Python

中的第三方库是由Python

用户自行编写和发布的模块或包。同样地,用户也可以将自己编写的模块和包作为库发布。库的构建与发布步骤如下。在与待发布的包同级的目录中创建setup.py

文件。以图

13.9

所示的包package

为例,此时的目录结构如图

13.9

所示。编辑setup.py

文件,在该文件中设置包中包含的模块,示例代码如程序段P13.6

所示。P13.6

构建库22fromdistutils.coreimport

setupsetup(name='a',version='0.1.0',description='package

a',author=

'wzh',py_modules=

['a.a1','a.a2'])(3)

在

setup.py

文件所在目录下打开命令行,使用

Python

命令构建Python

库,具体如下。pythonsetup.py

build命令行执行以上命令,输出信息如图

13.11

所示。第

13

章

虚拟环境与程序打包发布23图

13.11 构建库的输出信息输出显示构建成功。构架完成后,目录结构如图

13.12

所示。(a)

目录结构图

13.12(b)

构建的库构建的目录结构24在图

13.12

中,build

目录下的lib

文件夹就是通过Python

命令构建的库。(3)

在setup.py

文件所在目录下打开命令行,使用Python

命令创建库的安装包,具体如下。pythonsetup.py

sdist创建完成后,目录结构如图

13.13

所示。(a)

目录结构图

13.13(b)

安装包创建的安装包第

13

章

虚拟环境与程序打包发布25在图

13.13

中,dist

目录下的.tar

格式的文件就是通过Python

命令生成的库的安装包。安装包可以自己安装使用,也可以分享给他人或发布到网络平台。如果自己或他人希望在本地机安装此包,则需要复制压缩文件包package-0.1.0.tar,然后解压,进入package-0.1.0

目录,运行以下本地安装命令。pythonsetup.py

install该命令最终会将demo_1.py、demo_2.py

复制到Python

环境存放第三方模块的目录。安装成功后,直接使用import

导入即可使用该模块。还可以在dist

目录下,执行以下命令。pipinstall

.\package-0.1.0.tar此命令也会将demo_1.py、demo_2.py

复制到Python

环境存放第三方模块的目录。26库的发布将自己开发好的模块上传到PyPI

网站上,使其成为公开的资源,可以让全球用户自由使用。在PyPI

官网中发布库的步骤如下。

PyPI

官网注册。PyPI

网站:。远程上传发布。进入

setup.py

文件所在目录,使用命令“pythonsetup.py

sdist

upload”,即可将模块代码上传并发布。管理发布的模块。登录

PyPI

官网,如果模块已经上传成功,当登录

PyPI网站后便可在右侧导航栏看到管理入口。单击包名进入后可以对模块进行管理,当然也可以从这里删除模块。分享第三方库。模块发布完成后,其他人只需要使用pip

就可以安装模块文件。如果你更新了模块,其他人则可以通过

pip

install--upgrade

<模块第

13

章

虚拟环境与程序打包发布27名>

命令来更新。当然,也可以将自己开发好的模块上传到GitHub

网站上,使其成为公开的资源,供全球用户下载使用。

13.3 PyInstaller

库打包Python

文件为exe

文件13.3.1

程序打包为exe

文件事实上,大部分用户编写的软件很少需要发布到

PyPI

上供众人下载,通常情况下软件的使用者都是Windows

用户,所以将Python

文件打包成一个可执行的exe

文件,直接在Windows

系统中运行才是主要的打包方式。将Python文件打包成exe

文件有多种工具可以选择,如PyInstaller、py2exe

等,下面介绍PyInstaller

打包工具的使用方法。PyInstaller

是一个第三方库,它能够在Windows、Linux、Mac

OS

X

等操作系统中将

Python

源文件打包,通过对源文件打包,Python

程序可以在28没有安装Python

的环境中运行,也可以作为一个独立文件,方便传递和管理。PyInstaller

可以在Windows、Mac

OS

X

和Linux

系统中使用,但并不是跨平台的。如果希望打包成exe

文件,则需要在Windows

系统中使用PyInstaller进行打包工作;如果希望打包成

mac

app,则需要在

Mac

OS

系统中使用PyInstaller

进行打包工作。本节学习使用PyInstaller

将Python

文件打包成exe文件的方法。PyInstaller

库的常用参数及其功能如表

13-1

所示。表

13-1 PyInstaller

库的常用参数及其功能参数名功能描述-h,-help查看该模块的帮助信息-F,-onefile产生单个的可执行文件-D,-onedir产生一个目录(包含多个文件)作为可执行程序-d,-debug产生debug

版本的可执行文件第

13

章

虚拟环境与程序打包发布29-a,-ascii不包含unicode

字符集支持-w,-windowed,-noconsol指定程序运行时不显示命令行窗口(

仅对Windows

有效)-c,-nowindowed-console,指定使用命令行窗口运行程序(仅对

Windows

有效)-o

DIR,-out=DIR指定spec

文件的生成目录。如果没有指定,则默认使用当前目录来生成spec

文件-p

DIR,-path=DIR设置Python导入模块的路径(与设

置PYTHONPATH

环境变量的作用相似)。也可使用路径分隔符(Windows

使用分号,Linux

使用冒号)来分隔多个路径-n NAME ,-name=NAME指定项目(产生的spec)名字。如果省略该选项,那么第一个脚本的主文件名将作为spec

的名字30表中列出的只是

PyInstaller

模块所支持的常用选项,

如果需要了解PyInstaller

选项的详细信息,则可通过pyinstaller

-h

来查看。13.3.2 PyInstaller

工具打包Python

文件为exe

文件PyInstaller

工具的命令语法如下。pyinstaller

选项参数 xxx.py无论项目源程序是单文件的应用,

还是多文件的应用,

只要在使用PyInstaller

命令时编译作为程序入口的Python

源程序即可。下面先创建一个app

目录,在该目录下创建一个app.py

文件,文件中包含的代码如程序段P13.7

所示。P13.7

app.pydef

main():第

13

章

虚拟环境与程序打包发布31print('程序开始执行')print(‘你好,欢迎来到

Python

课堂!’)if

name

==

'

main

':main()然后,使用命令行工具进入app

目录,执行如下命令。pyinstaller-F

app.py执行上面的命令,将看到详细的生成过程。当生成完成后,app

目录下将会多一个

dist

目录,并在该目录下将会有一个

app.exe

文件,这就是使用PyInstaller

工具生成的exe

可执行程序。在命令行窗口中进入dist

目录,在该目录下执行app.exe,将会看到该程序生成如下输出结果。程序开始执行32你好,欢迎来到

Python

课堂!该程序没有图形用户界面,如果读者试图通过双击来运行该程序,则只能看到程序窗口一闪就消失了,这样将无法看到该程序的输出结果。上面的命令中使用了-F

选项,该选项指定生成单独的exe

文件,因此,在dist

目录下生成了一个单独的大约为

6MB

的

app.exe

文件(在

Mac

OS

X平台上生成的文件就叫app,没有后缀);与-F

选项对应的是-D

选项(默认选项),该选项指定生成一个目录(包含多个文件)作为程序。下面先将PyInstaller

工具

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论