赞
踩
经常会碰到python包要打包成sdk放到PyPi上开源的情况。
说明:
在下面准备前,还需要在pypi网站上注册账户。否则无法上传到pypi网站上。
另外,我还准备了github的账户,当然什么公钥也生成了,在github上保存好,便于git操作,这里不表。
一、准备
1、setup.py文件,这个不详述,到处都有介绍。
setup.py文件是打包发布的关键性文件之一。具体可以参考:
https://docs.python.org/3.8/distutils/setupscript.html#installing-additional-files
里面内容详细,是权威的资料。
其中,我个人setup.py文件如下:
#!/usr/bin/env python #-*- coding:utf-8 -*- import os from setuptools import setup, find_packages MAJOR =1 MINOR =0 PATCH =0 VERSION = f"{MAJOR}.{MINOR}.{PATCH}" def get_install_requires(): reqs = [ 'pandas>=0.18.0', 'requests>=2.0.0', 'toml>=0.10' , 'pyzstd >=0.15', 'numpy>=1.9.2' ] return reqs setup( name = "dbpystream", version = VERSION, author ="songroom", author_email = "rustroom@163.com", long_description_content_type="text/markdown", url = 'https://github.com/songroom2016/dbpystream.git', long_description = open('README.md',encoding="utf-8").read(), python_requires=">=3.6", install_requires=get_install_requires(), packages = find_packages(), license = 'Apache', classifiers = [ 'License :: OSI Approved :: Apache Software License', 'Natural Language :: English', 'Operating System :: OS Independent', 'Programming Language :: Python', 'Programming Language :: Python :: 3.6', 'Topic :: Software Development :: Libraries :: Python Modules', ], package_data={'': ['*.csv', '*.txt','.toml']}, #这个很重要 include_package_data=True #也选上 )
重点是,要对setup.py进行检查,以确认模块是否语法正确。
$ python3 setup.py check
如下:
D:\py_projects\dbpystream\> python setup.py check
running check
表明setup.py语法检查通过。
需要提醒的是,如果你的包里,需要读出原目录中相关的.txt,csv,toml等格式文件,这个你要记得带上。否则,打包的时侯,不会为这个进行打包。会自动忽略,当你pip后,你就会发现报错,少了这个文件。
2、LICENSE,格式内容
通常用这个:
Copyright (c) 2018 The Python Packaging Authority Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
3、README.md
这个自己整一下即可以。这个是markdown格式
5、.gitignore
整一个,这个不是必须的。是上传github上要得到的,清爽一点。
__pycache__/ *workspace *.py[cod] build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ pip-wheel-metadata/ htmlcov/ .tox/ .nox/ .hypothesis/ .pytest_cache/ *.egg-info/ .vscode/ .*.swp .coverage .coverage.* .cache nosetests.xml coverage.xml junit*.xml *.cover MANIFEST .installed.cfg *.egg *.manifest *.spec *.log *.con *.out env.sh *-env.sh
二、打包、上传
说明,下面命令中python3,如果有python软链接到python3的,直接可以用python,不需要用python3.具体大家看情况。就不作特别说明了。
1、安装好打包 工具
python3 -m pip install --user --upgrade setuptools wheel
2、在指定的目录下,进行打包;打包后会生成两个文件
python3 setup.py sdist bdist_wheel
会生成几个文件夹,build,dist,.egg-info等。
3、上 传pypi
(1)安装上传工具
python3 -m pip install --user --upgrade twine
(2)上传pypi
有些可以试一下:
py- m twine upload dist/*
或
twine upload dist/*
三、各种坑
1、pip升级问题
ERROR: Could not install packages due to an OSError: [WinError 5] 拒绝访问。: 'c:\\python310\\lib\\site-packages\\pip-21.2.3.dist-info\\entry_points.txt'
Consider using the `--user` option or check the permissions.
报错信息中推荐使用 --user 命令,
C:\Python310\python.exe -m pip install --user --upgrade pip
后面解决。
PS D:\dbpystream> pip -V
pip 22.3.1 from C:\Users\****\AppData\Roaming\Python\Python310\site-packages\pip (python 3.10)
成功升级。
2、pip install 后找不到module问题
重点应放在,在没有上传pypi前,比如test.py是否正常(强烈建议test.py应放在\test文件夹下)。也就是说,如果在没有上传前,就存在找不到module的情况,上传后,虽然已经下载成功,但仍会报“找不到module”的错误。
建议:
(1)、先检查代码是否正常。在上传前,看看程序是不是正常,module是否正常,比如,
__init__.py #是否在文件夹中,起到module的作用。
(2)、先找样包练下手。从github上找一个实例,看看别人封装的代码,自已走一下,有什么问题。如果正常,再打包自己的库到pypi,这样可以少踩一些坑。
3、pip install后,找不到相应的捆绑资源文件(csv,txt,toml等)
这种情况是,pip install没问题,但是运行时会出现一些问题:
比如,
Exception: toml_file :C:\Users\aaaa\AppData\Roaming\Python\Python310\site-packages\dbpystream\method.toml
does not exist!
强烈建议,不要在module中增加在指定的地址下读取相应与module捆绑的资源性文件(csv,txt,toml),因为打包后,module的地址已经被改变了,并不是原来的module显现结构,并不能按原来的目录下读取相应的文件。
经历的坑:原来在module中用method.toml文件配置了一些信息,便于函数读取。但是配置了各种参数后,仍不起作用,后面只能放弃。后改用method.py的方式,把相关的配置信息从toml格式,改成了dict格式。
替换后,这个仍在原来的目录下,这样比较方便。
4、不能上传问题
除密码和账户原因外,你需要注意:
这个在刚玩的时侯会碰到。你不能覆盖性上传一个文件,因为pypi不认相同的版本号的包重复上传。你只能把version版本号往上加。
比如,原来是0.1.0的,改成0.1.1,再次上传就OK了。
5、双因素认证的坑【新坑】
2023年年底,pypi采用了双因素认证。这个是需要登陆pypi的账户后,进行认证。特别注意的是:
右边的六位数的验证码,需要通过以下步骤获得:
六位数认证码可以通过以下代码生成
import pyotp
key = 'EV4JWPKX5SRPTVC3MR*********' # 从红箭头处复制copy过来
totp = pyotp.TOTP(key)
print(totp.now())
上面类似731347数字填到右边即可。
在项目目录下,配置.pypirc文件,这个文件的位置:
1、linux
$HOME/.pypirc
2、windows
C盘的user/下。
格式如下:
[distutils]
index-servers=pypi
[pypi]
repository = https://upload.pypi.org/legacy/
username = __token__
password = <Token>
否则cmd下就会要求你输入API token。
四、验证
pip install XXXX
除检查下载是否顺利外;同时,打开python IDE,看一下运行是否正常。
import XXXX
如果各正功能如预期,证明验证OK.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。