python setup
使用Python以来,基本不可逃避的就是setup.py文件,因为我们要安装各种各样的python软件或者其它第三方package,但是经常使用python
setup.py install进行安装,却不甚明白该文件的工作原理。由于目前工作涉及了openstack,一个基于python的云操作系统,因此,理解一些python的基本知识是必须要的。故找时间了解了基本的python
setup.py文件的制作。
一、一个简单的setup.py文件:
比如,我们经常使用的一个SSH的package:paramiko,其用于建立基于ssh协议的会话,下载地址为:https://github.com/paramiko/paramiko。
打开其中的setup.py文件,简单注释,如下所示:
[python] view
plain copy
- import sys
- from setuptools import setup # setuptool工具
- if sys.platform == ‘darwin‘:
- import setup_helper
- setup_helper.install_custom_make_tarball()
- # Version info -- read without importing
- _locals = {}
- with open(‘paramiko/_version.py‘) as fp: # 获取paramiko文件的version号,注册到paramiko中
- exec(fp.read(), None, _locals)
- version = _locals[‘__version__‘] # 写入到dict中
- # 介绍:https://docs.python.org/3/distutils/setupscript.html
- setup(
- # meta-data数据,此外还有maintainer,maintainer_email,
- # 其中name、version、url是必须的
- name = "paramiko", # package name
- version = version, # package version
- description = "SSH2 protocol library", # 简要描述
- long_description = longdesc, # 一般用于读取readme.txt文件的内容。。。在package发布到pypi上的时候,这项是必须的,作为package介绍
- author = "Jeff Forcier", # pacakge author
- author_email = "[email protected]", # author‘s email
- url = "https://github.com/paramiko/paramiko/", # 下载地址
- packages = [ ‘paramiko‘ ], # 安装包,这里会去检索paramiko/__init__.py文件。。。也就是告诉distutils时需要处理哪些包
- license = ‘LGPL‘, # license授权
- platforms = ‘Posix; MacOS X; Windows‘, # 平台
- # classifiers分类
- classifiers = [
- ‘Development Status :: 5 - Production/Stable‘,
- ‘Intended Audience :: Developers‘,
- ‘License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)‘,
- ‘Operating System :: OS Independent‘,
- ‘Topic :: Internet‘,
- ‘Topic :: Security :: Cryptography‘,
- ‘Programming Language :: Python‘,
- ‘Programming Language :: Python :: 2‘,
- ‘Programming Language :: Python :: 2.6‘,
- ‘Programming Language :: Python :: 2.7‘,
- ‘Programming Language :: Python :: 3‘,
- ‘Programming Language :: Python :: 3.2‘,
- ‘Programming Language :: Python :: 3.3‘,
- ‘Programming Language :: Python :: 3.4‘,
- ‘Programming Language :: Python :: 3.5‘,
- ],
- # 依赖包,有几种符号
- install_requires=[
- ‘cryptography>=1.1‘,
- ‘pyasn1>=0.1.7‘,
- ],
- )
Setup脚本是利用distutils进行编译、发包、安装模块的主要脚本。Setup主要的目的是将我们的发布包按照distutils描述的方式组织,方便开发安装。
其实,在setup.py文件中,主要包含以下内容:
S1、列出所有的packages,使用关键字packages和package_dir两个;
S2、列出所有的依赖模块,使用py_modules;
S3、列出扩展模块,包括扩展名和包、源代码文件、预处理选项如include、library选项,以及其它的一些选项;
S4、文件发布版与依赖包的关系,使用==、>=、!=、<等
S5、直接安装scripts文件,使用scripts关键字;
S6、安装package data,使用package_data;
S7、安装一些其他文件,使用data_files;
S8、额外的meta-data数据,包括version、name、author、classifiers等,网址上介绍了meta-data数据的东西,这个是setup.py文件中必须的参数:
上面的(1)表示该字段是setup文件中必须的。这个就是我们当前的setup文件的编排格式。
二、setup文件使用:
理解了setup.py文件里面的字段含义,那么我们就可以学习setup文件的使用了,其主要有以下几种方式:
python setup.py build #编译
python setup.py install #安装,最基本的安装方式
python setup.py sdist #制作分发包,制作一个源码包,格式为zip/tar.gz
python setup.py bdist_egg #制作一个二进制分发包
python setup.py bdist_wininst #制作windows下的分发包,exe程序
python setup.py bdist_rpm #制作linux下的rpm包,需要rpm程序支持
下面我们开始编写一个setup.py文件,内容如下:
[python] view
plain copy
- from distutils.core import setup
- setup(
- name = ‘myfirsttest‘,
- version = ‘1.0‘,
- py_modules = [‘myfirsttest‘]
- )
执行python setup.py sdist后,会生成一个文件包,里面会有对应的源码包:
到时候,客户端拿到这个压缩包后,解压,并执行python setup.py install就可以进行安装。
三、setup.cfg文件:
Stackflow上的解释:
http://stackoverflow.com/questions/27077355/how-to-use-setup-cfg-instead-of-setup-py-with-python-2-7
The problem is that the setup.cfg file does not do what you want. It does not provide parameters
to the setup function. It is used to supply parameters to the commands that setup.py makes
available. You can list the supported commands with setup.py --help-commands. You should see something like:
Setup.cfg并不是setup函数中的参数,而是setup.py文件中的一些参数,可以使用setup.py --help-commands命令查看:
这只是python setup.py的参数,但是这并不是直接需要写入setup.cfg文件中的。具体的,还要再继续查看,比如,sdist命令可使用的参数如下:
可以看到,当我们需要制作源码的时候,可以使用verbose、quiet等参数,这就是我们需要写入setup.cfg文件中的。
而setup.cfg的文件中是按照section去处理的,比如:
比如,当我们setup.cfg中如下时:
当我们执行python setup.py build安装的时候,实际执行的是如下命令:
参考:https://docs.python.org/2/install/index.html#distutils-configuration-files
四、distutils介绍:
setuptool通过封装distutils,简化了package的安装过程。Distutils,全称为:Python
Distribution Utilities,从python 1.6以来,distutils已经成为python标准库的一部分,极大的简化了用户安装新模块、第三方包和标准工具,并且创建这些distribution的方式也极大的简化了。Distutils既为支持RPM的linux提供了创建RPM的方式,也提供了制作windows
exe的方式。Distutils通过将setup.py、setup.cfg、source
code、第三方编译包集成在一起,做成可用的package。
Distutils统一了linux和windows下python的安装方式,并不区分是rpm包还是tarball方式,只是执行python
setup.py install即可进行安装。并且,可以令不同的开发者向同一块package进行工作。
一般来讲,我们会依次执行build和install,其中build会将所有的源文件进行编译,并放到同对应目录下,生成build/lib文件,源文件不限于python,也可以是C/C++。如果考虑到build的速度,可以使用--buuld-base指定build的目录。编译完成后,使用install安装,安装的过程,是将该目录下的文件拷贝到对应的代码目录下。
我们默认的安装目录是:
如果是默认的话,一般是标准的python安装目录,linux下一般prefix和exec-prefix是/usr,而windows下是C:\Program
Files\Python,可以采用如下方式查询安装目录:
我们可以使用如下参数去指定install的方式:
S1、--user:linux下的用户选择,确保该用户对安装目录有权限;
S2、--home:指定安装目录:
可以与--install-purelib、--install-scripts、--install-platlib、--install-data组合使用,确认各个子条目的安装目录。
S3、--prefix:指定安装目录的前缀,如果目录不存在,则会创建一个
S4、--exe-prefix:制定扩展模块的安装目录前缀
S5、--install-scripts:指定scripts的安装目录,可以与--home、--prefix组合使用
--install-base
S6、--install-platbase
我们的配置参数有很多,但是setuptools为我们提供了一个合理的方式,就是专有的配置文件
Windows下的配置文件为:
Linux下的配置文件为:
这也就是我们经常看到的setup.cfg文件的作用,里面的配置可以如下:
当我们安装完成后,python会按照目录去搜素安装的包,其搜素的路径在sys模块中:
Sys.path中为空的表示当前目录,当我们需要搜索某一目录的时候,可以将该目录加入到sys.path中。也可以通过PATHHOME设置更改目录。
distutils官网:https://docs.python.org/2/distutils/
五、setup和pip安装的方式区别:
Setup |
Pip |
|
相同 |
1.包安装 |
1.包安装 |
不同 |
1.手动下载; 2.没有统一的管理; 3.Easy_install会调用setuptool进行安装 |
1.自动下载; 2.自动管理包,更新卸载更方便,执行pip uninstall即可; 3.提供了对virtualenv的管理 |