当前位置:   article > 正文

Python: 打包发布到PyPi及踩坑经历_pypi打包

pypi打包

经常会碰到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
  • 1

里面内容详细,是权威的资料。

其中,我个人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 #也选上

)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

重点是,要对setup.py进行检查,以确认模块是否语法正确。

$ python3 setup.py check
  • 1

如下:

D:\py_projects\dbpystream\> python  setup.py check

running check
  • 1
  • 2
  • 3

表明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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

在这里插入图片描述

二、打包、上传

说明,下面命令中python3,如果有python软链接到python3的,直接可以用python,不需要用python3.具体大家看情况。就不作特别说明了。

1、安装好打包 工具

python3 -m pip install --user --upgrade setuptools wheel
  • 1

2、在指定的目录下,进行打包;打包后会生成两个文件

python3 setup.py sdist bdist_wheel
  • 1

在这里插入图片描述会生成几个文件夹,build,dist,.egg-info等。

3、上 传pypi
(1)安装上传工具

python3 -m pip install --user --upgrade twine
  • 1

(2)上传pypi
有些可以试一下:

 py- m twine upload dist/*
  • 1

 twine upload dist/*
  • 1

在这里插入图片描述

三、各种坑

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.
  • 1
  • 2

报错信息中推荐使用 --user 命令,

C:\Python310\python.exe -m pip install --user  --upgrade pip
  • 1

后面解决。

PS D:\dbpystream> pip -V      
pip 22.3.1 from C:\Users\****\AppData\Roaming\Python\Python310\site-packages\pip (python 3.10)
  • 1
  • 2

成功升级。

2、pip install 后找不到module问题

重点应放在,在没有上传pypi前,比如test.py是否正常(强烈建议test.py应放在\test文件夹下)。也就是说,如果在没有上传前,就存在找不到module的情况,上传后,虽然已经下载成功,但仍会报“找不到module”的错误。

建议:
(1)、先检查代码是否正常。在上传前,看看程序是不是正常,module是否正常,比如,

__init__.py #是否在文件夹中,起到module的作用。
  • 1

(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!
  • 1
  • 2

强烈建议,不要在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())
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述上面类似731347数字填到右边即可。

在项目目录下,配置.pypirc文件,这个文件的位置:
1、linux

$HOME/.pypirc
  • 1

2、windows

C盘的user/下。
  • 1

格式如下:

[distutils]
index-servers=pypi

[pypi]
repository = https://upload.pypi.org/legacy/
username = __token__
password = <Token>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

否则cmd下就会要求你输入API token。

四、验证

pip install XXXX
  • 1

除检查下载是否顺利外;同时,打开python IDE,看一下运行是否正常。

import XXXX
  • 1

如果各正功能如预期,证明验证OK.

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/695623
推荐阅读
相关标签
  

闽ICP备14008679号