Python发布包

Python发布包 —by Mr.Liang

需做实验需要的代码,看附件python包管理测试源码.rar

在桌面建立一个文件夹 nester,里面有setup.py文件,跟两个文件夹mynester、yournester

目录结构如下:

clip_image002[4]

setup.py 内容如下:

from distutils.core import setup

setup(

name='nester',

version='1.0.0',

packages = ['mynester','yournester'],

author='liang',

author_email='[email protected]',

url = 'http://chinesejie.sinaapp.com',

description='nothing',

)

记得包mynester跟yournester下面都要有一个文件__init__.py ,即使是空的也可以,用来说明这是一个包结构。

里面的nester.py nester2.py文件都是随意写的。现在我们的目的就是将这些包安装到本地第三方库,也就是%PYTHON_HOME%\Lib\site-packages的下面。

clip_image004[4]

当前这下面有21个文件。

第一步,发布

在nester文件目录下打开dos 窗口,

使用命令python setup.py sdist来发布包,

clip_image006[4]

之后这下面多了一个文件叫做MANIFEST跟一个dist文件夹。

Dist文件夹下面的zip就是用来发布程序的,也是上传到pypi的文件。

第二步,安装到本地

使用命令python setup.py install

这时候目录%PYTHON_HOME%\Lib\site-packages\下多了三个对象。你猜猜是什么?

clip_image008[4]

我们可以使用mynester跟yournester下面的类了。

看看yournester下面的nester.py 文件:

clip_image010[4]

使用python来导入使用,如图:

clip_image012[4]

成功。。。

第三步,上传到pypi上面去:先去pypi上面注册用户。

在nester文件目录下,使用python setup.py register 这个命令进行注册

clip_image014[4]

接着他会保存登录文件(用户名密码)为~/.pupirc文件

注意要保证上传的package名字是python上面没有的,这篇文章中使用了nester命名,已被人占用,请使用别的名字。在附件中name属性已经改成linester了,见setup.py文件

clip_image016[4]

上传成功。。登录到pypi网站,能看到你提交的包。。

那么要怎么删除安装的第三方包呢?方法:(在linux下可使用下面这种方法)

python setup.py install --record files.txt 记录安装后文件的路径

cat files.txt|xargs rm -rf  删除这些文件

第四步,使用egg

随意建立文件夹nester_egg,在里面增加setup.py文件,内容如下:

#-*- coding:utf-8 -*-

from setuptools import setup, find_packages

setup(

name = "nester_egg",

version="1.0.0",

packages = find_packages(),

zip_safe = False,

description = "egg test demo.",

long_description = "egg test demo, haha.",

author = "chinesejie",

author_email = "[email protected]",

license = "GPL",

platforms = "Independant",

url = "http://chinesejie.sinaapp.com", )

总的结构结构超简单:如图:

clip_image018[4]

运行命令:python setup.py bdist_egg来进行发布。。
再运行命令python setup.py install 来进行安装。。最后,我们发现
%PYTHON_HOME%\Lib\site-packages\下多了文件夹nester_egg-1.0.0-py2.7.egg结构如下:

clip_image020[4]

使用他:

clip_image022[4]

一般情况下,我们的源程序都放在src目录下,所以接下来将模块文件夹nester_egg移动到src里。但这样也要修改setup.py文件,修改find_packages函数中参数为’src’,同时增加package_dir参数:

packages=find_packages('src'),

package_dir = {'':'src'}

这样告诉setuptools在src目录下找包,而不是原来默认的工程根目录。

最后我们来手动的卸载以下刚才安装的egg文件,以python2.6版本为例,egg文件一般安装在%PYTHON_HOME%\Lib\site-packages\目录下,该目录下还有一个easy-install.pth文件,用于存放安装的egg信息。:

$ cd /usr/local/lib/python2.6/dist-packages

$ cat easy-install.pth|grep demo

./demo-0.1.0-py2.6.egg

$ ls -F|grep demo

demo-0.1.0-py2.6.egg/

卸载egg文件很简单,首先将包含此egg的行从easy-install.pth中删除,然后删除egg文件夹即可。

第五步 关于pth

我们上面见识了两种安装python第三方库的方法,一种是sdist后再install,另一种是bdist_egg之后再install。

前者有一个很大的缺陷:在之前测试的项目linester中,我们有两个package,一个是mynester,一个是yournester,但是安装到%PYTHON_HOME%\Lib\site-packages\下面之后,我们就乱了,%PYTHON_HOME%\Lib\site-packages\目录下的mynester,yournester只存放py文件,

linester-1.0.0-py2.7.egg-info文件的信息如下:

Metadata-Version: 1.0

Name: linester

Version: 1.0.0

Summary: nothing

Home-page: http://chinesejie.sinaapp.com

Author: liang

Author-email: [email protected]

License: UNKNOWN

Description: UNKNOWN

Platform: UNKNOWN

这里面找不到一点信息指出了mynester与yournester是属于linester整体的。也就是说,linester-1.0.0-py2.7.egg-info的存在就可有可无了,这也是python在Distutils本身设计的缺陷,无比期待Distutils2 的出现啊。。

链接:::(Python打包工具)http://www.ituring.com.cn/article/19090

Python标准库中提供的Distutils打包工具充斥了上述的种种问题,但由于它是一种标准,所以人们要么继续忍受并使用它,或者转向更先进的工具Setuptools,它在Distutils之上提供了一些高级特性。另外还有Distribute,它是Setuptools的衍生版本。Pip则是一种更为高级的安装工具,它依赖于Setuptools

easy_install是setuptools和distribute自带的安装脚本, 也就是一旦 setuptools 或 distribute安装完毕, easy_install 也便可用. 最大的特点是自动查找 Python 官方维护的包源 PyPI , 安装第三方 Python 包非常方便; 使用:

:::

后者在%PYTHON_HOME%\Lib\site-packages\下生成以.egg 结尾的文件夹,例如:nester_egg-1.0.0-py2.7.egg

另外我们要介绍 第三种 自主定义的方式。。。

使用pth文件。。wxpython的安装就是这么干的。

启动python解释器,Python解释器在遍历已知的库文件目录(sys.path)过程中,如果见到一个 .pth 文件,就会将文件中所记录的路径加入到 sys.path 设置中,于是 .pth 文件说指明的库也就可以被 Python 运行环境找到了。

这么说的话我们可以这么干了。

在%PYTHON_HOME%\Lib\site-packages\ 写一个google文件夹跟一个“google.pth”文件。

google 文件夹 结构:gg.py写了一个名字为go函数。

clip_image024[4]

google.pth 这个文件任意取名,但是必须以pth结尾

内容很简单。。

clip_image026[4]

或者直接写google也行,反正他跟google文件夹在同一目录。

clip_image028[4]

成功。。这有什么意义呢? 这么理解吧:

Python解释器启动,因为site-packages是他的库文件目录,还在这下面发现有一个pth文件,就把./google这个路径加到了sys.path下了,这个google文件夹下面有一个名为mygoogle的模块,就能成功找到gg.py 文件。。

假如我们在启动python解释器之后,才把google.pth跟google文件夹 放在site-packages文件目录下,再去使用from mygoogle import gg,那么一定报错。。。其实也很容易理解:

Python解释器启动过程中,就将库目录索引写入内存了,到了运行时候是去找内存索引的,启动中没有加载google.pth跟google文件夹的信息,运行时也不会找到这些信息,即使他们后来加入了site-packages目录下了。 想想也应该是这样的,cython是不可能没运行一条语句就去到硬盘上面找找所谓的文件了,那样效率就太低了,要知道搜索硬盘加载索引这些事情早就在你能运行python语句之前做过了。。

解决方法就是 exit() 退出cython,然后再进去。。

这时候又产生一个疑问,能不能在运行py文件的时候,在这个py文件同级目录下放一个pth文件,然后它会自动读取这个pth文件内容,这分明就是异想天开。在同级目录下放其他py文件或者模块还能理解。。

运行py文件的过程是:启动cython解释器--加载py文件--运行时会去sys.path加载需要的其他模块 这个运行py文件的过程可以看出,在加载py文件之前,cython解释器已经加载目录索引完毕了,除非py文件所在的目录正好是cython加载的库目录的一条,在cython启动之初该路径就加入sys.path中,不然pth文件就不可能进入cython所加载的库目录中。

按照上面绿色标志部分说法,如果启动cython之后,在任意sys.path下再加入一个py文件,之后再在解释器cython调用这个py文件,是可以被调用的。

关于python 包管理,库目录加载到此结束。。---end

添加sys.path…

import sys

sys.path.append('./google')

除此之外,使用pydev 也可以自定义添加路径,但这种方法最好别用,毕竟你开发的项目别人不一定用eclipse导入,这样就会出现找不到py模块等很多问题。

你可能感兴趣的:(Python发布包)