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