# 模块构建文件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 动态发现服务和插件,下面详细讲
```