python中的distutils包主要用创建共享包,安装包,在平时安装python模块的时候,使用的命令如下:

python setup.py install

其实以上代码就是distuitls包提供的功能,直接使用setup.py来进行安装一个包,在用这种方式安装包之后,就可以直接在系统中进行import这个模块。

主要就是在安装的时候,已经将这个包install到python的类库中,从而可以直接进行import,也相当于将这个模块的路径放到了python寻找模块的路径当中。

此文主要用来讲述,如何使用python中的distutils模块来制作一个安装包。

1、 几个关键参数作用

packages:由字符串组成的一个list,即disutils需要操作的python包

package_dir:包所对应的目录名称,一个字典格式

scripts:单独的script文件用来创建和插入的,字符串组成的列表

data_files:需要插入的数据文件,一个list;主要用来放一些配置文件等,在list中的每个记录中都是一个tuple,(目录,文件),目录表示要插入的地方,文件表示为需要把哪些文件插入到目录中,data_file的文件名称是不能改变的。

2、 关于为啥要使用包

在进行打包的时候,有两种使用方式,一种是使用包的方式,也就是我们所要讲的方式,一种是使用模块的方式,一般使用模块的时候,最好是只有一个模块或者这几个模块在同一个包中。

在有多个模块需要打包的时候,而且多个模块在不同的包中,那么就可以使用包的方式进行打包,也就是指定packages的方式,当使用package的方式的时候,在package的目录中,必须存在一个文件为__init__.py,表示这个是一个包,其中的内容可以为空。

3、根据目录结构创建setup.py

以下为例子中的目录结构,如下所示:

[root@FTP ~]# tree ansible
ansible
|-- README
|-- bin
| `-- ansible
|-- lib
| `-- ansible
| `-- __init__.py
|-- library
| `-- kel
`-- setup.py 4 directories, 5 files

根目录为ansible,然后在里面具有setup.py文件,有一个包为lib/ansible/,在这个包里有指定的init文件,从而这个是一个包,还有个一个是脚本文件为bin/ansible,在其中类库未library/kel,从而可以写出其中的setup.py文件内容如下:

from distutils.core import setup

setup(
name='ansible',
version='1.0',
description='this is a test of the disutils',
packages=['ansible'],
package_dir={'ansible':'lib/ansible'},
data_files=[('/usr/share/',['library/kel']),],
scripts=['bin/ansible']
)

以上表示的意思为:name表示此模块的名称,version表示版本,description表示为一个描述信息,packages表示包,package_dir表示包对应的目录,data_files表示需要拷贝的配置文件,上述表示拷贝library目录下的kel文件到/usr/share目录中,scripts可执行脚本问bin/ansible,记住基本都是相对路径,除了要拷贝的地方也就是/usr/share

进行打包命令如下:

[root@FTP ansible-1.0]# python setup.py sdist
running sdist
running check
warning: check: missing required meta-data: url warning: check: missing meta-data: either (author and author_email) or (maintainer and maintainer_email) must be supplied warning: sdist: manifest template 'MANIFEST.in' does not exist (using default file list) writing manifest file 'MANIFEST'
creating ansible-1.0
creating ansible-1.0/bin
creating ansible-1.0/lib
creating ansible-1.0/lib/ansible
creating ansible-1.0/library
making hard links in ansible-1.0...
hard linking README -> ansible-1.0
hard linking setup.py -> ansible-1.0
hard linking bin/ansible -> ansible-1.0/bin
hard linking lib/ansible/__init__.py -> ansible-1.0/lib/ansible
hard linking library/kel -> ansible-1.0/library
creating dist
Creating tar archive
removing 'ansible-1.0' (and everything under it

进行打包之后,会在当前目录下新建一个文件夹名称为dist,在其中会有一个压缩包名称为ansible-1.0.tar.gz,表示的意思为name加上版本号,进行解压缩,然后安装,如下:

[root@FTP dist]# ls -l
total 4
-rw-r--r-- 1 root root 694 May 10 09:05 ansible-1.0.tar.gz
[root@FTP dist]# tar -zxf ansible-1.0.tar.gz
[root@FTP dist]# cd ansible-1.0
[root@FTP ansible-1.0]# ls
PKG-INFO README bin lib library setup.py
[root@FTP ansible-1.0]# python setup.py install
running install
running build
running build_py
creating build
creating build/lib
creating build/lib/ansible
copying lib/ansible/__init__.py -> build/lib/ansible
running build_scripts
creating build/scripts-2.7
copying and adjusting bin/ansible -> build/scripts-2.7
changing mode of build/scripts-2.7/ansible from 644 to 755
running install_lib
running install_scripts
copying build/scripts-2.7/ansible -> /usr/local/python/bin
changing mode of /usr/local/python/bin/ansible to 755
running install_data
running install_egg_info
Removing /usr/local/python/lib/python2.7/site-packages/ansible-1.0-py2.7.egg-info
Writing /usr/local/python/lib/python2.7/site-packages/ansible-1.0-py2.7.egg-info

在上面的信息可以看到,脚本文件ansible已经拷贝到了/usr/local/python的bin/ansible中,这个目录主要是看python的安装位置,我的python是安装在/usr/local/python中,从而默认拷贝到python的安装路径中。

可以看到拷贝配置文件的时候,是没有看到具体的拷贝信息的,但是在实际上已经插入了相关的类库配置文件,如下所示:

[root@FTP other-2.0]# ls -l /usr/share/kel
-rw-r--r-- 1 root root 86 May 9 09:23 /usr/share/kel

从而类库文件也会进行插入。

总结:

在python中使用模块distutils,core中的setup方法来进行打包,打包的时候也可以打包成rpm的格式,也可以打包成exe的windows格式,具体的查看官方文档即可,网址为:

https://docs.python.org/2/distutils/index.html#distutils-index

在进行打包的时候,选择使用包的方式还是模块的方式,如果使用包的方式,那么表示有好几个模块分布在不同的包中,如果使用模块的方式,那么表示模块都在一个包中的情况下。

在打包的时候执行的指令为python setup.py sdist,在安装包的时候,解压,然后执行python setup.py install

在进行打包的时候,主要就是setup.py文件的写法,注意其中的包的路径均为相对路径,参数的类型具体可以参看官方文档:

https://docs.python.org/2/distutils/apiref.html#module-distutils.core

python的disutils创建分发包的更多相关文章

  1. Python 分发包中添加额外文件【新手必学】

      在制作一个 Python 分发包时经常需要把一些文件添加到包中.最常见的例子是你希望通过 pip install命令安装 Python 包时会在 /etc/ 等目录下自动添加默认配置文件,由此可以 ...

  2. VC分发包版本问题

    来源:http://www.cnblogs.com/mixiyou/archive/2010/02/09/1663620.html 之前曾经写过一篇个人经历,是关于VC2005分发包版本不一致而引起应 ...

  3. Python | 面试必问,线程与进程的区别,Python中如何创建多线程?

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题第20篇文章,我们来聊聊Python当中的多线程. 其实关于元类还有很多种用法,比如说如何在元类当中设置参数啦,以及一 ...

  4. python 读写、创建 文件

    python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块. 得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 返回指定目录下的所有文件和目 ...

  5. 使用Python Shapefile Library创建和编辑Shapefile文件

    介绍 shapefile是GIS中非常重要的一种数据类型,在ArcGIS中被称为要素类(Feature Classes),主要包括点(point).线(polyline)和多边形(polygon).P ...

  6. 为 Confluence 6 分发包设置一个邮件会话

    最简单设置 Confluence 电子邮件发服务器的方否认就是通过 Confluence 的管理员控制台进行设置.请参考 Configuring a Server for Outgoing Mail ...

  7. 使用fpm 方便快速生成postgresql extension分发包

    fpm 是一个不错,而且强大的rpm.deb,系统启动服务工具包,我们可以用来快速的生成专业的软件分发包 演示一个pg 扩展包分发包的生成(rpm 以及deb) 安装fpm sudo gem inst ...

  8. python 读写、创建 文件的方法(必看)

    python 读写.创建 文件的方法(必看) 更新时间:2016年09月12日 10:26:41 投稿:jingxian 我要评论下面小编就为大家带来一篇python 读写.创建 文件的方法(必看). ...

  9. python 一次创建多级目录

    python 一次创建多级目录沙漠骆驼:qq音乐import osos.mkdirs('/home/user/app')

随机推荐

  1. xshell配置密码公钥登录

    1:生成公钥 2:密钥类型选择为rsa,长度为2048,并点击下一步,如下所示: 这里的密码是给密钥设置了密码,那么在使用这个密钥时也要输入密码,也可以设置为空 3:保存密钥 (1):当你选择了输入密 ...

  2. Buildroot 指定内核版本

    /******************************************************************************** * Buildroot 指定内核版本 ...

  3. kubeadm搭建kubernetes集群之一:构建标准化镜像

    使用docker可以批量管理多个容器,但都是在同一台电脑内进行的,这在实际生产环境中是不够用的,如何突破单机的限制?让多个电脑上的容器可以像单机上的docker-compose.yml管理的那样方便呢 ...

  4. CentOS跨网段访问

    centos6.2_64删除虚拟网卡 virbr0 卸载以下组件,然后重启系统 yum remove libvirt yum remove libvirt-python 来源:http://www.i ...

  5. Android:BroadcastReceiver

    参考:<第一行代码:Android> 郭霖(著)   Broadcast分类 注册方式: 动态广播 在代码中注册receiver 一定要手动在onDestroy()时调用unregiste ...

  6. BZOJ2595 Wc2008 游览计划 【斯坦纳树】【状压DP】*

    BZOJ2595 Wc2008 游览计划 Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为一个 ...

  7. Create A .NET Core Development Environment Using Visual Studio Code

    https://www.c-sharpcorner.com/article/create-a-net-core-development-environment-using-visual-studio- ...

  8. Errors running builder 'DeploymentBuilder' on project ' 解决方法

    此问题一般发生在Myeclipse 保存文件并自动部署时候. Errors occurred during the build. Errors running builder 'DeploymentB ...

  9. 引用 LPSTR、LPCSTR、LPTSTR、LPCTSTR、LPWSTR及LPCWSTR的意义及区别

    1.ANSI(即MBCS):为多字节字符集,它是不定长表示世界文字的编码方式.ANSI表示英文字母时就和ASCII一样,但表示其他文字时就需要用多字节.   2.Unicode:用两个字节表示一个字符 ...

  10. Java的八种基本数据类型及其包装类

    Java有八种基本数据类型,所谓基本类型就是说存储时仅存在栈中,那么与之相对就是引用类型,引用类型既存在栈里又存在堆里,栈内存放堆内地址. 八种基本类型分别为byte short int long f ...