setup.py(Legacy version)
说明
setup脚本是使用Distutils来构建、分发、安装模块。其主要目的是向Distutils描述模块分发包。
使用方法
1.创建目录结构
demo
|--setup.py
|--README.md
|--bin
| |--test
|--lib
| |--pkg1
| | |--__init__.py
| | |--data
| | | |--data1.dat
| | | |--data2.dat
|--files
| |--fileA.txt
说明:
- 目录下须有setup.py文件
- 包内须有_init_文件。如本示例包为pkg1
2.编写setup.py
from distutils.core import setup
setup(
name='demo', # 模块名字
version='1.0', #版本
description='this is a test of the disutils', #描述
author='yafei', # 作者
author_email='[email protected]', #作者邮箱
url='https://www.demo.com', #包的主页
packages=['pkg1'], # 包
package_data={'pkg1':['data/*.dat']}, # 包数据文件,与包的执行相关
package_dir={'':'lib'}, # 表示包都在lib文件夹下
data_files=[('/usr/share/'),],
# scripts=['bin/test.py']
)
说明:
- __init__.py:如果告诉distutils包需要默认在对应的包下存在__init__.py文件。如packages = ['foo'],则distutils需可以找到foo/__init__.py
name: 模块名字。
模块(module): Python中可复用的基本代码单元,可由其他代码import的一块代码,这里我们只关注三种类型的模块:纯python模块,扩展模块和包。
纯python模块(pure Python module): 由python编写的模块,包含在单独的py文件中(或者是pyc/pyo文件)。
扩展模块(extension module):由实现Python的底层语言编写的模块(C/C++ for Python, Java for Jython)。通常包含在单独的动态加载文件中,比如Unix中的so文件,windows中的DLL文件,或者是Jython扩展的java类文件。(注意,目前为止Distutils只能处理Python的C/C++扩展)
包(package):包是含其他模块的模块,经常由包含_init_.py文件的目录发布。
Root包(root package): 包层次关系中的根(它不是真正的包,因为它不包含_init_.py文件)
引用这里
package_dir={'key': 'value'}: key为包名,若为空,则表示全部包。value为包存在的相对分发的相对路径
- scripts: 之前产生的纯的或非纯的模块都需要通过import来被使用,但是通过scripts可以是模块通过脚本运行。
scripts是一些包含Python源代码的文件。
3.配置文件
一般创建发布不可能写下所有的内容,有可能需要从用户或用户系统中获取信息。只要信息比较简单比如如从一列文件夹中搜索c头文件,那么提供配置文件“setup.cfg”给用户是一种比较简单容易的方法。此外,配置文件还提供给任何命令选项一些默认值,可以通过命令行或更改配置文件对之修改。
配置文件是介于setup脚本和命令行之间的一个优先级。从而有一下可行性
- installers
4.创建源分发包
//TODO:Packaging and Distributing Projects
参考资料
- Python深入:Distutils发布Python模块
- 可爱的 Python: 使用 setuptools 孵化 Python egg
- python的disutils创建分发包
- Python包管理工具setuptools详解
- 如何使用和制作 Python 安装模块(setup.py)
- Python的包管理工具
- Python 二三事
- Python 包管理工具解惑
附录
pyc和pyo
- pyc文件:是Python编译后的字节码(bytecode)文件。只要你运行了py文件,python编译器就会自动生成一个对应的pyc字节码文件。这个pyc字节码文件,经过python解释器,会生成机器码运行(这也是为什么pyc文件可以跨平台部署,类似于Java的跨平台,java中JVM运行的字节码文件)。下次调用直接调用pyc,而不调用py文件。直到你这个py文件有改变。python解释器会检查pyc文件中的生成时间,对比py文件的修改时间,如果py更新,那么就生成新的pyc。
- pyo文件:是python编译优化后的字节码文件。pyo文件在大小上,一般小于等于pyc文件。如果想得到某个py文件的pyo文件,可以这样: python -O -m py_compile xxxx.py python文档是这样描述的:这个优化没有多大作用,只是移除了断言。