官方文档:描述python项目如何打包,建议通读
因为Django项目不同于一般的python包,要在与manage.py同级目录下新建__init__.py文件,不然setuptools并不会将项目中的文件打包。(猜测setuptools有自己的识别文件是否需要打包的方式,没有__init__.py它就不觉得这是需要打包的文件,就不会对它打包。所以它也不会进一步进其他目录看看是否有.py文件)
使用 setup.py 将 Python 库打包分发到 PyPI 踩坑指南
这篇文章讲了作者如何打包Django项目的,可以一看。另外里面也有对include_package_data
参数和package_data
参数的理解。里面部分解释了我上面的问题,setup.py只打包python包,跟python包无关的其他文件默认情况下是不打包的,要另外设置。而且作者的django项目是没有manage.py的,直接是我项目的子文件那种结构。嗯这点还是不太能参考。我主要担心加了那个多余的__init__.py文件会对我的项目日后运行产生影响。
打包前期准备
1、为了打包的整个流程要下载的包
python -m pip install --user --upgrade setuptools wheel twine
setuptools
:打包用的
wheel
:生成.whl文件用的
twine
:上传包用的
2、打包需要的说明文件
参考官方文档
MANIFEST.in
本文件的存在意义是,setup.py只会打包.py文件。但我们可能需要一些其他文件来支持整个项目的运行,可以把需要打包的其他文件都写入该文件中。
在setup.py文件中的package_data参数所做的事其实跟MANIFEST.in
差不多,但package_data(根据官方文档的说法来看)能更精准一点?
编写规范:
注意:里面文件的相对路径都是基于setup.py文件所在目录的,并不是python项目的目录!我之前写错了,打包了好多次都提示我no files found matching
,我还以为是语法写错了,其实是路径写错了。
参考:
官方文档-描述MANIFEST.in文件的作用
官方文档-描述MANIFEST.in的语法
include *.txt
recursive-include examples *.txt *.py
prune examples/sample?/build
- include all files in the distribution root matching *.txt,
- all files anywhere under the examples directory matching *.txt or *.py
- exclude all directories matching examples/sample?/build
打包包:
在有setup.py所在目录下cmd
sdist是构建源码发布包的意思
python setup.py sdist bdist_wheel
:生成.whl+.tar.gz
python setup.py sdist --formats=gztar,zip
:生成.tar.gz+.zip
上传包:
在有setup.py所在目录下cmd
python -m twine upload --repository testpypi dist/*
安装包:
1、普通安装
上传只有zip文件时,在site package下也会有已经解压好的miniserver源程序文件夹
上传whl+tar.gz时,下载的结果时一模一样的。miniserver源程序文件夹存在
pip install -i https://test.pypi.org/simple/ example-pkg-Aileen==0.0.1
2、安装在指定路径下(跟普通安装文件夹是一样的,一个.egg-info文件夹,一个打包时的源工程文件夹(名字也一模一样))
也就是说除了存放路径改变,其他都没变
但是出现问题,当使用pip list或卸载包的时候,python都提示并没有这个包(猜测:python也是根据路径去寻找已经安装的包并显示,而不安装在原有路径下后,新路径并没有在python已有查询路径中)
pip install --target=C:\Users\Cntech\Desktop\test package_name
问题整理
- 能否安装在固定目录下
可以,但有遗留问题。如pip list,pip uninstall无法识别该包 - .tar.gz样式也会在安装时自动解压吗
可以,好像在windows下也可以成功解压? - files文件夹如何附加在安装包中
用package_data或者MANIFEST.in
data_files与它的区别:官方文档对data_files的解释。就算zip压缩不报错,安装时生成whl也会报错 - 学习一下package_data等参数的具体,查看是否能够在不加__init__.py文件的情况下打包整个项目
setuptools官网对添加data files文件的文档
放弃在不加__init__.py的情况下打包整个项目,有违python包的初衷。也发现了正常打包一个django项目时,manage.py文件其实不需要。现在有发现,它还是需要的,数据库的迁移都要用这个,接下来看看数据库的改变如果能不用这个文件实现,就可以不放进去。