python setuptools模块介绍
-
模块介绍
setuptools是python distutils的加强版,使开发者构建和发布python包更加容易,特别是当包依赖于其他包时。用setuptools构建和发布的包与distutils发布的包类似。包的使用者无需安装setuptools就可以使用该包。
-
配置setup文件
from setuptools import setup, find_packages import sys, os import re import time with open('README.md', 'rb') as f: readme = f.read().decode('utf-8') install_requires = [] with open('requirements.txt', 'rb') as f: for req in f.readlines(): install_requires.append(req.strip()) setup( name='Personas', #包名 version='0.0.1', #版本信息 description='persons_tools', long_description=readme, author='xxx', author_email='xxx@xxx.com', install_requires=install_requires, # 安装依赖的其他包 packages= find_packages(exclude=['ez_setup', 'examples', 'tests']), #要(include)打包(exclude不要打包)的项目文件夹 package_data = { 'conf':'conf/*', 'service.personas_flask.models.incom':'service/personas_flask/models/incom/*', 'service.personas_flask.models.industry':'service/personas_flask/models/industry/*', 'service.personas_flask.models.profession':'service/personas_flask/models/profession/*', 'personas.labels_pool.conf':'personas/labels_pool/conf/*', }, scripts=["personas/personas_calculate.py"], zip_safe=False, # 设定项目包为不安全,需要每次都检测其安全性 include_package_data=True, # 自动打包文件夹内所有数据 )
-
参数说明
3.1 find_packages
find_packages的参数有:一个源码目录,一个include包名目录,一个exclude包名目录。如果这些参数被忽略,则源码目录默认是setup.py脚本所在的目录。该函数返回一个列表,可以赋值给package参数。
有些工程可能会使用src或者lib目录作为源码树的子目录,因此这些工程中,需要使用“src"或者”lib"作为find_packages()的第一个参数,当然,这种情况下还需要设置package_dir={"": “lib”},否则会报错
from setuptools import setup, find_packages setup( name = "HelloWorld", version = "0.1", package_dir = {'':'lib'}, packages = find_packages('lib'), )
find_packages()函数遍历目标目录,根据include参数进行过滤,寻找python包。对于python3.2以及之前的版本,只有包含
__init__.py
文件的目录才会被当做包。最后,对得到的结果进行过滤,去掉匹配exclude参数的包。include和exclude参数是包名的列表,包名中的"."表示父子关系。
lib/ foo.py __init__.py bar/ __init__.py bar.py
则find_packages(exclude=[“lib”])(或者packages = find_packages(include=[“lib”])),只是排除(或包含)lib包,但是却不会排除(包含)lib.bar包。
3.2 package_data
方法1)
setup { package_data = ['', ['*.txt']] }
目的是打包时把txt文件放进去
方法2)
from setuptools import setup, find_packages setup( ... package_data = { # 任何包如果包含 *.txt or *.rst 文件都加进去,可以处理多层package目录结构 '': ['*.txt', '*.rst'], # 如果hello包下面有*.msg文件也加进去 'hello': ['*.msg'], } )
方法3):自动识别,多层package都可以处理
from setuptools import setup, find_packages setup( ... include_package_data = True )
会搜索所有package的所有数据文件,这种方法比较省事
方法4):
数据位于package的子目录中,采用手工设置的方法,比如在mypkg的data目录下,可以这样做:
from setuptools import setup, find_packages setup( ... packages = find_packages('src'), # include all packages under src package_dir = {'':'src'}, # tell distutils packages are under src package_data = { # If any package contains *.txt files, include them: '': ['*.txt'], # And include any *.dat files found in the 'data' subdirectory # of the 'mypkg' package, also: 'mypkg': ['data/*.dat'], } )
-
安装并执行
- 安装:
python setup.py install
- 执行:
python setup.py sdist
会在dist文件夹生成项目的压缩包 - 执行:
python setup.py bdist_wininst
会生成exe安装文件
- 安装: