Python的构建工具setup.py
setup.py各参数介绍:
1 | --name 库名称,▲需要注意的是不要大写,不然会有坑 |
find_packages()还可以将包统一放在一个src目录中,另外,这个包内可能还有aaa.txt文件和data数据文件夹。另外,也可以排除一些特定的包 find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"])
实测操作
需要事前交代的内容
模板setup.py
1 | #!/usr/bin/env python |
待打包的目录树:
E:.
│ MANIFEST.in
│ out.json
│ README.md
│ setup.py
│
└─files
in.json
txt.txt
world.py
__init__.py
1 | ACCOUNT = 'mrli' |
MANIFEST.in
内容
MANIFEST.in
决定了除了Py文件外的什么说明、配置文件会被打包进去(如.txt、.json
)
1 | # Include the README |
注意我操作这边时并没有include json文件,所以生成的项目树中也没有任何的json文件(无论是in.json
还是out.json
),而txt.txt
是包含的,并且之后甚至能用readTXT()函数,直接读取打包的txt.txt
的内容。
关于MANIFEST.in
项目里会有一些非py文件,比如html和js等,这时候就要靠include_package_data
和 package_data
及packages
来指定了。package_data
一般写成 {'your_package_name': ["files"]}
。keywords便于pypi索引。
▲.然而只设置了include_package_data
还没完,还需要一个MANIFEST.in
文件来明确指定哪些文件需要打到包中。===>如果include_package_data=True
的话,那么还需要写个MANIFEST.in
来明确。
python setup.py install
安装
安装后的目录树
│ MANIFEST.in
│ out.json(这是原来就在的)
│ README.md
│ setup.py
│
├─build(生成的文件夹)
│ ├─bdist.win-amd64
│ └─lib
│ └─files
│ txt.txt
│ world.py
│ init.py
│
├─cltest.egg-info(生成的文件夹)
│ dependency_links.txt
│ PKG-INFO
│ requires.txt
│ SOURCES.txt
│ top_level.txt
│
├─dist(生成的文件夹)
│ cltest-0.3.0-py3.7.egg
│
└─files
in.json
txt.txt
world.py
__init__.py
一共生成了3个文件夹为build
、dist
、cltest.egg-info
,
-
build\lib
下的就是自己想要打包的库的内容,即files
里的模块。 -
dist
是加入到虚拟环境库下的文件venv\Lib\site-packages
中可以找到cltest-0.3.0-py3.7.egg
-
cltest.egg-info
中有生成很多文件-
dependency_links.txt
空的 -
PKG-INFO
内容是setup.py中设置的,关于库的描述-
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23Metadata-Version: 2.1
Name: cltest
Version: 0.3.0
Summary: know how to
Home-page: UNKNOWN
Author: Gao Liang
Author-email: 10630529664@qq.com
License: MIT
Description:
# 测试Setup工具
hhhh
Platform: UNKNOWN
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Requires-Python: >=3.0.0
Description-Content-Type: text/markdown
-
-
requires.txt
:内容是setup.py
中install_requires=REQUIRED
里设置的依赖内容,写法参看requirements.txt
-
SOURCES.txt
:列出了所有被打包的文件-
1
2
3
4
5
6
7
8
9
10
11MANIFEST.in
README.md
setup.py
cltest.egg-info/PKG-INFO
cltest.egg-info/SOURCES.txt
cltest.egg-info/dependency_links.txt
cltest.egg-info/requires.txt
cltest.egg-info/top_level.txt
files/__init__.py
files/txt.txt
files/world.py
-
-
top_level.txt
:列出了可用的模块,应该是由packages=find_packages(exclude=('tests',)),
决定的,由于我只写了一个包files
,所以内容也只有-
1
files
-
-
如何使用?
这边需要注意的是在setup.py
中设置name='cltest'
是指的整个库的名字,但真正使用的是要看这个库下有哪些可用的包,包下有哪些模块。
在我的这个例子下面,可以通过库名cltest
来找到、下载我这个库。在安装完以后,导入就得知道包名了,这边是files
,所以使用得代码应该是
1 | from files import world |
这个现象其实还挺常见的,比如beautifulSoup4
库,使用的时候是from bs4 import ..
;以及python-opencv2
库,需要import cv2 as cv
。其实就是这边库名与包名的区别。
坑点记录:
1 | from files import world |
由于’txt.txt’是相对路径,所以只有在运行脚本位置有txt.txt
文件时才不会报错,一开始from files import world
时报错txt.txt
以为时txt.txt
没有被打包进去(其实可以通过Sources.txt
文件查看到底有没有被打包进去),后来才明白是使用readTXT()
的当前目录下不存在而已。
Author: Mrli
Link: https://nymrli.top/2019/06/15/Python的构建工具setup-py/
Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.