zoukankan      html  css  js  c++  java
  • python的disutils创建分发包

    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






  • 相关阅读:
    Dropout: A Simple Way to Prevent Neural Networks fromOverfitting
    Write Custom Java to Create LZO Files
    Avro schemas are defined with JSON . This facilitates implementation in languages that already have JSON libraries.
    Storage Types and Storage Policies
    splittability A SequenceFile can be split by Hadoop and distributed across map jobs whereas a GZIP file cannot be.
    This means that only a small number of nodes must be read from disk to retrieve an item.
    Apache Kafka® is a distributed streaming platform. What exactly does that mean?
    (t,p,o) t:p>=o there cannot be more consumer instances in a consumer group than partitions
    Goldilocks
    Sqoop
  • 原文地址:https://www.cnblogs.com/kellyseeme/p/5525029.html
Copyright © 2011-2022 走看看