setuptools就是比distutils好用,所以,在实际工作中,如果需要打包python代码,基本上都用setuptools,并且实现了自己的一套模板,基本可以通用,现在把这个模板记录下来:
首先必须写一个setup.py脚本:
# -*- coding:utf-8 -*-
from setuptools import setup
from setuptools import find_packages
import os
def strip_comments(path):
"""也可以使用读取requirements.txt文件的形式,下面是从
requirements.txt文件读取依赖列表的常见做法之一:"""
return path.split('#', 1)[0].strip()
def reqs(*f):
"""
"""
return list(filter(None, [strip_comments(path) for path in open(os.path.join(os.getcwd(), *f)).readlines()]))
setup(
name='projects',
version='0.0.1',
description='小明的第一个程序',
long_description='小明的第一个程序,用于演示如何打包',
author=['xiaoming', 'xiaoli'],
author_email=['[email protected]','[email protected]'],
url='项目的git仓库地址,没有可以不给',
packages=find_packages(),
platforms=['any'],
keywords=["test setuptools"],
install_requires=reqs('requirements.txt'),
package_data={'': ['*.cfg', '*.xml', '*.txt', '*.py']}
)
下面举一个例子:
xiaoming
├── requirements.txt
├── setup.py
├── README.md
└── projects
└── proj1
├── __init__.py
├── add.py
└── config
├── a.cfg
└── b.txt
即如下目录结构:
配置文件a.cfg,这个文件跟打包无关,只是演示在打包时,怎么把配置文件也打包进去,这里配置文件我们随便写了点内容:
[python_version]
platforms=Linux
python_version=3.6.0
[author]
author_name=zhangsan
add.py文件的内容为读取配置文件,并且实现一个加法,当调用加法时,首先会print配置文件里的内容,然后再运算加法:
import configparser
from pathlib import Path
cfg = configparser.ConfigParser()
config_path = Path(__file__).parent / "config" /"a.cfg"
cfg.read(config_path)
def add(a,b):
print("platform:{}".format(cfg.get('python_version','platforms')))
print("python version{}".format(cfg.get('python_version','python_version')))
return a + b
requirements.txt为这个项目的依赖项,比如我们这个项目用到了pathlib这个库,所以,我们的requirements.txt可以这么写:
# pip==16.0.0
pathlib2==2.3.4
其余涉及到的文件,都是空文件,那么现在来打包这个python程序,在命令窗口中,首先进入./xiaoming这个目录,然后运行如下命令(第一个命令是编译,第二个命令是生成压缩文件,该压缩文件解压后就可以安装):
> python setup.py build
> python setup.py sdist
就会在同级目录下生成一个dist文件夹,里面是xiaoming_project-0.0.1.tar.gz,解压后,运行python setup.py install 就可以安装了。
- 注意大部分情况不需要编译,因为都是脚本语言
- 如果不需要打包成压缩包的形式,也没必要运行dist命令,直接python setup.py install 就可以安装了
setup.py参数说明
#python setup.py build # 编译
#python setup.py install #安装
#python setup.py sdist #生成压缩包(zip/tar.gz)
#python setup.py bdist_wininst #生成NT平台安装包(.exe)
#python setup.py bdist_rpm #生成rpm包
或者直接"bdist 包格式",格式描述如下:
#python setup.py bdist --help-formats
--formats=rpm RPM distribution
--formats=gztar gzip'ed tar file
--formats=bztar bzip2'ed tar file
--formats=ztar compressed tar file
--formats=tar tar file
--formats=wininst Windows executable installer
--formats=zip ZIP file
注2: setup参数:
name 打包名称
version 版本
....
playforms 所支持的平台 ,例中只支持2.7
package_dir 源码所在目录
packages 源码目录下那些目录要被打包
py_modules 需要打包的模块
requires 定义依赖模块
...
参考:
1.https://zhuanlan.zhihu.com/p/136223755
2.https://www.cnblogs.com/yunfeiqi/p/6844771.html
3.https://blog.csdn.net/whatday/article/details/90767387