# 模块构建文件setup.py ```python # 编写一个python模块,可以从当前环境中使用 from distutils.core import setup setup(name='wangutils', version="1.0", description="wang's utils", author="wang", author_email="wangyuedong94@qq.com", py_modules=["utils.StringUtils"], ) #使用包名.模块名定义了一个模块,当然可以定义多个包,在包下可以定义多个模块,目录结构如下 |-- setup.py |-- suba | |--aa.py | |--StringUtils.py | |--bb.py | |__init__.py |-- subb |-- cc.py |-- dd.py |__init__.py #假设我把StringUtils.py放到aa.py的位置,那么还需要在suba包下的__init__.py下引入StringUtils,__init__.py内容如下: from . import StringUtils #将常用的字符串函数放到一个StringUtils.py类中: import sys if sys.version_info[0] == 2: from urlparse import urlparse else: from urllib.parse import urlparse import re class StringUtils(): @classmethod def isEmpty(cls, haystack): if haystack is None: return True elif len(haystack) == 0: return True else: return False #使用命令行将刚才写的模块进行编译打包 python setup.py build running build running build_py creating build creating build/lib creating build/lib/utils copying utils/__init__.py -> build/lib/utils copying utils/StringUtils.py -> build/lib/utils #执行之后会在同级目录下生成一个dist目录,使用tree命令查看层级发现 . ├── MANIFEST ├── __init__.py ├── build │ └── lib │ └── utils │ ├── StringUtils.py │ └── __init__.py ├── setup.py └── utils ├── StringUtils.py └── __init__.py #上面的命令只是将源码拷贝到build目录下,还需执行另一条命令对build目录进行打包 python setup.py sdist python setup.py sdist running sdist running check warning: check: missing required meta-data: url warning: sdist: manifest template 'MANIFEST.in' does not exist (using default file list) warning: sdist: standard file not found: should have one of README, README.txt writing manifest file 'MANIFEST' creating shuiguangutils-1.0 creating shuiguangutils-1.0/utils making hard links in shuiguangutils-1.0... hard linking setup.py -> shuiguangutils-1.0 hard linking utils/StringUtils.py -> shuiguangutils-1.0/utils hard linking utils/__init__.py -> shuiguangutils-1.0/utils creating dist Creating tar archive removing 'shuiguangutils-1.0' (and everything under it) #再次执行tree命令 . ├── MANIFEST ├── __init__.py ├── build │ └── lib │ └── utils │ ├── StringUtils.py │ └── __init__.py ├── dist │ └── shuiguangutils-1.0.tar.gz ├── setup.py └── utils ├── StringUtils.py └── __init__.py #多了一个dist目录,就是刚才打好的包,把这个文件传给别人安装即可 #安装模块也很简单,只需要将此tar.gz的包解压后,使用命令安装即可: python setup.py install running install running build running build_py creating build creating build\lib creating build\lib\utils copying utils\__init__.py -> build\lib\utils copying utils\StringUtils.py -> build\lib\utils running install_lib creating C:\Python27\Lib\site-packages\utils copying build\lib\utils\StringUtils.py -> C:\Python27\Lib\site-packages\utils copying build\lib\utils\__init__.py -> C:\Python27\Lib\site-packages\utils byte-compiling C:\Python27\Lib\site-packages\utils\StringUtils.py to StringUtils.pyc byte-compiling C:\Python27\Lib\site-packages\utils\__init__.py to __init__.pyc running install_egg_info Writing C:\Python27\Lib\site-packages\shuiguangutils-1.0-py2.7.egg-info #将你的模块安装到别人的全局环境中去了 #简单的测试,看看有没有安装成功: from utils.StringUtils import * print StringUtils.isEmpty("a") print StringUtils.isEmpty("") #在函数式编程中,如果我们将函数直接写在文件中,而不是封装到某一个类里面,比如:在StringUtils中添加一个全局函数: def strReplaceOnce(haystack, left='', right=''): return haystack.replace(left, right, 1) #类似这样,导入方式和上面的方式一样: from utils.StringUtils import * print strReplaceOnce("aba", "b", "c") ``` ## setup.py介绍 ```python from setuptools import setup, find_packages setup( name = "test", version = "1.0", keywords = ("test", "xxx"), description = "eds sdk", long_description = "eds sdk for python", license = "MIT Licence", url = "http://test.com", author = "test", author_email = "test@gmail.com", packages = find_packages(), include_package_data = True, platforms = "any", install_requires = [], scripts = [], entry_points = { 'console_scripts': [ 'test = test.help:main' ] } ) --name 包名称 --version (-V) 包版本 --author 程序的作者 --author_email 程序的作者的邮箱地址 --maintainer 维护者 --maintainer_email 维护者的邮箱地址 --url 程序的官网地址 --license 程序的授权信息 --description 程序的简单描述 --long_description 程序的详细描述 --platforms 程序适用的软件平台列表 --classifiers 程序的所属分类列表 --keywords 程序的关键字列表 --packages 需要处理的包目录(包含__init__.py的文件夹) --py_modules 需要打包的python文件列表 --download_url 程序的下载地址 --cmdclass --data_files 打包时需要打包的数据文件,如图片,配置文件等 --scripts 安装时需要执行的脚步列表 --package_dir 告诉setuptools哪些目录下的文件被映射到哪个源码包。一个例子:package_dir = {'': 'lib'},表示“root package”中的模块都在lib 目录中。 --requires 定义依赖哪些模块 --provides定义可以为哪些模块提供依赖 --find_packages() 对于简单工程来说,手动增加packages参数很容易,刚刚我们用到了这个函数,它默认在和setup.py同一目录下搜索各个含有 __init__.py的包。 其实我们可以将包统一放在一个src目录中,另外,这个包内可能还有aaa.txt文件和data数据文件夹。另外,也可以排除一些特定的包 find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"]) --install_requires = ["requests"] 需要安装的依赖包 --entry_points 动态发现服务和插件,下面详细讲 ```