virtualenv venv1
source venv/bin/activate
$python
>>>import sys
>>>sys.executable
这里写代码片(venv)$deactivate
rm -R venv
在这一部分,我们会尝试吧第二章中卡发的留言板应用放到P有PI上面进行公开,在这个过程中学习一下setup.py 的写法以及如何向PyPI上面上传程序包。
setup.py 的功能,python的封装离不开setup.py,封装可以便于编写的长须供其他用户或者项目使用,封装的大部分时间都要小号在白那些setup.py上面。这个名字实在python中定好的,不可以随便更改,我们会在这个文件中定义程序包的名称,包以及依赖包的信息等元数据。另外,将程序包注册到PyPI的操作也需要通过setup.py来进行。
首先,先制作一个可以运行的setup.py的空壳 setup.py
from setuptools import setup
setup(name='guestbook')
setup.py的指令一览如下图:
下面我们来创建最基本的源码包,源码包需要通过python setup.py sdist命令来创建,如下图所示:
查看目录如下所示:
现在,dist目录下面已经生成了guestbook-0.0.0.tar.gz文件,这个文件目前只包含setup.py。
注意!!在执行过程中我们看到了一些warning,这些waring 指出的项目最好都设置一下,我们将会在后面学会如何进行设置。
首先,我们先来了解一下python项目一般的目录结构。当封装对象只有一个”.py “文件时,其结构如下所示:
/home/chengyiming/project_name
+--MANIFEST.in
+--README.rst
+--packagename.py
+--setup.py
如果封装目录下包含多个”.py “文件时,其结构如下所示:
/home/chengyiming/project_name
+--MANIFEST.in
+--README.rst
+--packagename/
| +--__init__.py
| +--module.py
| +--templates/
| +--index.html
+--setup.py
我们的留言板应用有下述文件组成:
文件路径 | 说明 |
---|---|
guestbooki.py | 服务器程序 |
guestbook.dat | 提交数据文件 |
static/main.css | CSS文件 |
templates/index.html | 输出的HTML的模板,用于显示“提交/留言列表”的页面 |
虽然“.py”文件只有一个,但是static和templates目录下都包含文件,由于我们之前介绍的项目目录无法安装模板等文件,因此这里需要使用最后一种项目文件。最终文件安排如下表所示:
?home/chengyiming/guestbook/
+--LICENSE.txt
+--MANIFEST.in
+--README.rst
| +--__init__.py
| +--static/main.css
| +--templates/index.html
+--setup.py
现在我们来创建guestbook目录,将guestbook.py文件一发动到该目录下并命名为init.py。templates和static目录也要移动到guestbook目录下,guestbook.dat 不是我们要发布的东西,所以这里不需要它。 接下来,我们来实际用用这个封装用的结构
接下来,我们将在setup.py中设置程序包的信息,然后子啊MANIFEST.in 中制定捆绑的文件,接下来依次了解一下。 setup.py 首先,我们描述一下guestbook项目的setup.py
from setuptools import setup,find_packages
setup(
name='guestbook',
version='1.0.0',
packages=find_packages(),
include_package_data=True,
install_requires=['Flask',],
)
如果一个环境能够使用pip,那么这个环境一定安装了setuptools库。一般情况下,我们习惯使用setuptools提供的含有拓展功能的setup函数,下面来了解一下各个函数的意义:
packages=['guestbook','guestbook.server','guestbooki.server.dir','guestbook.storage',......]
find_packages()还可以自动搜索当前目录下的所有python程序包并返回程序包的名称,有了这个,我们便可以省去一个个列举的麻烦。
MANIFEST.in 为了将HTML文件,CSS文件等程序包资源与程序包捆绑刚在一起,我们需要使用MANIFEST.in来制定封装对象文件。 这里我们在setup.py所在的目录下创建MANIFEST.in文件,制定封装对象文件的范围。 MANIFEST.in
recursive-include guestbook *.html,*.css
recursive-include白哦是捆绑指定目录下所有与制定类型一致的文件,在上面的代码中,我们捆绑了guestbook目录下所有与.html和.css一致的文件。 现在我们希望使用这个程序包的环境能够安装这些捆绑好的程序包资源,所以需要把钱买你提到的install_package_data指定为True,不能忘记奥~ MANIFEST.in还可以捆绑vguestbook应用不适用的非程序包资源文件,比如LICENSE.txt,在发布、程序包时最好把许可文件也捆绑进去。 假设我们使用了BSD许可,并在LICENSE.txt文件中描述了许可条款,接下来,我们需要在MANIFEST.in里面添加对他的捆绑指定。 MANIFEST.in
recursive-include guestbook *.html *.css
include LICENSE.txt
include会捆绑所有于指定类型一致的文件,所以再添加了上面的指定语句之后,LICENSES.txt就和程序包捆绑在了一起。 确定运行环境
cd ..
virtualenv .venv
2.如图所示安装的包
guestbook-1.0.0已经被安装到了虚拟环境中,我们可以看到,记录程序包原数据位置饿的guestbook.egg-link文件被安装到了virtualenv 环境中,easy-install.path文件中添加了guestbook的源码位置。/ 这样的话,我们在其他PC或服务器上面构建环境是,就不必再一个个安装依赖包,如果今后需要添加或者更改依赖库,只需要按照i前面的流程更新setup.py,然后再执行一次pip install即可。
第二章的留言板项目是一个直接从python启动的脚本,要想让下载他的人用起来更加方便,最好生成一些用户命令,这里外婆们通过设置setup.py,让其自动生成guestbook命令。 我们在setup.py中添加了entry_points。这样在安装程序包时会自动生成guestbook命令。用户执行guestbook命令是将会调用guestbook模块的main函数。 但是guestbook/init.py中还没有main函数,所以我们需要添加这个函数,代码如下:
略
def main():
application.run('127.0.0.1',8000)
if __name__=='__main__':
application.run('127.0.0.1',8000,debug=True)
创建用于的发布的程序包时,执行python setup.py sdist命令
在dist目录下生成了guestbook-1.0.0.tar.gz。这个tar.gz文件中包含了guestbook/init.py,setup.py,LICENSE.txt,HTML,CSS等文件,只需要把这个文件安装到我们先安装应用的环境中,就可以运行pip install guestbook-1.0.0.tar.gz,直接从文件进行安装。
我们先将之前的内容提交到版本库,关于hg 的命令操作,在第一章和第六章有详细的介绍,目前的目录介绍如下所示:
/home/chengyiming/guestbook/
+--.venv/
+--LICENSE.txt
+--MANIFEST.in
+--guestbook
| +--__init__.py
| +--static/main.css
| +--templates/index.html
+--guestbook.dat
+--guestbook.egg-info/
+--setup.py
在开发python项目时,我们习惯将setup.py放在版本库最初级目录(根目录)下。这样我们就能使用pip直接从版本库进行安装。 另外,有些文件和目录是不用保存到版本库中,guestbook.dat文件的作用时记录留言板接收到的数据,这些数据没必要记录到版本库中。 guestbook.egg-info目录的作用是记录程序包的元数据,.venv可以重新生成,没必要保存在版本库 接下来,我们将除了以上三者的文件提交给版本库
cd ~/guestbook
hg init
hg add LICENSE.txt MANIFEST.in guestbook setup.py
hg ci -m "initial"
以下介绍设置流程说明书,总结该留言板应用开发环境的搭建流程,如下:
hg clone https://bitbucket.org/chengyiming/guestbook
cd guestbook
virtualenv .venv
source .venv/bin/activate
(.venv)$pip install .
(.venv)$guestbook
*Running on http://127.0.0.1:5000/
我们将上图的流程写入README.rst文件即可。 README.rst
==================
留言板应用
==================
目的
=====
练习开发通过web浏览器提交留言的web应用程序
工具版本
==============
:python:2.7.8
:pip: 1.5.6
:virtualenv:1.11.6
安装与启动方法
==================
从版本库获取代码,然后在该目录下搭建virtualenv环境:
$hg clone https://bitbucket.org/chengyiming/guestbook
$cd guestbook
$virtualenv .venv
$source .venv/bin/activate
(.venv)$pip install .
(.venv)$guestbook
开发流程
===========
用于开发的安装
-----------------
1.检测
2按照以下流程安装
(.venv)$pip install -e .
写完之后记得将README.rst文件提交到版本库
留言板的依赖包是Flask,但是,我们在开发初期很难确定好一款应用所有的依赖包,有时候还会放弃当前的包而改用其他的,特别是周期段,发布频繁的项目,通常每发布一次,就会变更一次依赖包。
使用pip 更换了程序包,这一步如何告知他人
(.venv)$pip install flask
(.venv)$pip install bottle
留言板的setup.py里面记录着依赖包的信息,我们只需要更改setup.py的设置即可。如果更改了setup.py的install _requires行,需要再次执行pip install -e 即使我们从fsetup.py中删除了flask,之前安装到环境中的flask 以及其关联的程序包也不会被卸载,若想删除没有用的程序包,需要通过virtualenv –clear 。等方法重建环境。 重建环境如下所示: (.venv)virtualenv –clear .venv #删除.venv环境内的全部依赖库 (.venv)virtualenv –clear .venv #删除.venv环境内的全部依赖库 (.venv)virtualenv –clear .venv #删除.venv环境内的全部依赖库 (.venv)pip install -e #根据./setup.py安装依赖库
我们不仅可以通过setup.py管理依赖包,还可以通过requirements.txt来管理依赖库。 创建requiments.txt: (.venv)$pip freeze >requirements.txt 其中记录了当前环境已经安装的所有程序包以及其明确的版本号
使用setiup.py管理依赖包时,没有指定版本,这是两者管理的一大区别 要想在其它环境中安装同样的程序包们,我们需要将这个文件防盗盖环境下,在安装 (.venv)$pip install -r requirements.txt 这样,环境中就安装了同样版本的程序包
制作wheel程序包之前,我们先来安装wheel pipinstallwheel接下来,生成wheel程序包pipinstallwheel接下来,生成wheel程序包pip install wheel 接下来,生成wheel程序包 python setup.py bdist_wheel ls dist/
我们之所以可以通过pip命令安装指定的程序包,是因为这些程序包都被注册到了PyPI上面,PyPI时python的官方网站,所有人都能随意上传以及下载python程序包,如果各位不介意公开自己开发的程序包,不妨将其注册在PyPI上。