Python将自己的Py文件(或包)发布至pip上
- 开始
- 只打包一个py文件
- 第一步在Pypi和Github上拥有自己的账号
- 第二步——有一个python库~
- pgzero_template.py
- README.md
- LICENSE
- setup.py
- 第三步——上传文件
-
- 尝试导入自己的项目
- 上传一个python包
- 结束语
开始
前几天本来是做了一个关于pgzero的模板文件,想发布到pip上面,但在CSDN上搜了114514年却没有任何成果。因为CSDN上只有关于上传python包的。最后是问了chatGPT才解决了问题,也算为CSDN补了个缺口吧!
只打包一个py文件
第一步在Pypi和Github上拥有自己的账号
上传一个py文件,首先需要在Pypi和Github上有账号。已经有了的同学可以直接去下一步
而本作者又比较懒,不想写这部分,所以请去其他博客康康。
第二步——有一个python库~
如果你想将自己的Python库发送至pip首先你得有个py文件
我的python库是长这样的:
/pgzero_template
----/pgzero_template.py
----/setup.py
----/README.md
----/LICENSE
其中pgzero_template
文件夹只是一个单纯的目录,取任何名字
皆可。只是用于区分其他文件。
pgzero_template.py
是库,即你的库的核心文件(虽然也只有一个文件(bruh))
README.md
是你库的长描述文件,后期我们对库的描述都在这里面
setup.py
是将项目打包的文件
LICENSE(注:没有后缀名)
是库的许可证书,可以在Pypi上获取
pgzero_template.py
接下来让我们挨个分析文件夹里面的文件。首先是pgzero_template.py
。这是你的库文件。我的库文本如下:
"""
@author: xiaofengkz
@date: 2023-2-25
pgzero的template程序(模板文件)
pgzero本身就是pygame的简化版本,但是我——xiaofengkz又把他简化了一下
使用方法:
:from template import * #必须得这样,否则无法运行
提供方法:
:template_draw(screen, bg=(255, 255, 255)
:template_update()
:template_on_key_down(keys, key)
:template_on_key_up(keys, key)
:template_on_key_down_ESCAPE()
:template_on_mouse_down(mouse, pos, button)
:template_on_mouse_up(mouse, pos, button)
:play_music(music_name='bg_music')
:stop_music()
:play_sound(sound_name)
How to use them:
Some examples:
:def draw():
template_draw(screen)
:def update():
template_update()
...and so on
开源包,任何人都可以使用并修改!
"""
import sys
import os
from pgzrun import *
import re
__version__ = '2.4'
LETTERS = list('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
LETTERS.append('ESCAPE')
LETTERS.append('SPACE')
LETTERS.append('RIGHT')
LETTERS.append('LEFT')
LETTERS.append('UP')
LETTERS.append('DOWN')
WIDTH = 1200
HEIGHT = 800
def template_draw(screen, bg=(255, 255, 255)):
screen.fill(bg)
for var in mod.__dict__:
if re.match('draw_.+',var):
function = getattr(mod,var)
function(screen)
def template_update():
for var in mod.__dict__:
if re.match('update_.+',var):
function = getattr(mod,var)
function()
def template_on_key_down(keys,key):
for letter in LETTERS:
if key == getattr(keys,letter):
for var in mod.__dict__:
if var == 'on_key_down_{}'.format(letter):
function = getattr(mod,var)
function()
def template_on_key_up(keys,key):
for letter in LETTERS:
if key == getattr(keys,letter):
for var in mod.__dict__:
if var == 'on_key_up_{}'.format(letter):
function = getattr(mod,var)
function()
def on_key_down_ESCAPE():
sys.exit()
def _none(pos):pass
def template_on_mouse_down(mouse,pos,button):
if button == mouse.LEFT:
function = getattr(mod,'on_mouse_left_down',_none)
function(pos)
if button == mouse.RIGHT:
function = getattr(mod,'on_mouse_right_down',_none)
function(pos)
if button == mouse.MIDDLE:
function = getattr(mod,'on_mouse_middle_down',_none)
function(pos)
def template_on_mouse_up(mouse,pos,button):
if button == mouse.LEFT:
function = getattr(mod,'on_mouse_left_up',_none)
function(pos)
if button == mouse.RIGHT:
function = getattr(mod,'on_mouse_right_up',_none)
function(pos)
if button == mouse.MIDDLE:
function = getattr(mod,'on_mouse_middle_up',_none)
function(pos)
def play_music(music_name='bg_music'):
getattr(mod, 'music').play(music_name)
def stop_music(): getattr(mod, 'music').stop()
def play_sound(sound_name):
getattr(getattr(mod, 'sounds'), sound_name).play()
在文件中你必须要添加一个__version__
变量,用于填写库的版本号,在后期如果要更新库,需要将__version__
的值改为更高的版本号。
README.md
这里面只需要写一下库的详细描述即可。
这是我的:
A template for pgzero.
You can use it to type pgzero-file more quickly.
You only should type some like this:
"
from pgzero_template import *
"
LICENSE
LICENSE
文件文本可以在这里挑选
这是我的LICENSE文件:
MIT License
Copyright (c) [year] [fullname]
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.
setup.py
setup.py
文件如下:
from __future__ import print_function
from setuptools import setup, find_packages
import pgzero_template
with open("README.md", "r", encoding='utf-8') as fh:
long_description = fh.read()
setup(
name="pgzero_template",
version=pgzero_template.__version__,
author="xiaofengkz",
author_email="xiaofengkz@163.com",
description="a template for pgzero",
long_description=long_description,
long_description_content_type="text/markdown",
license="MIT",
url="https://github.com/zhec5hl01/python-games",
py_modules=['pgzero_template'],
install_requires=[
"pgzero <= 1.2.1",
"pygame <= 2.1.2"
],
classifiers=[
"Topic :: Games/Entertainment ",
'Topic :: Games/Entertainment :: Puzzle Games',
'Topic :: Games/Entertainment :: Board Games',
"Topic :: Software Development :: Libraries :: Python Modules",
"Programming Language :: Python",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
'Programming Language :: Python :: Implementation :: CPython',
],
)
name
是包名。发布之前请上 PyPi 搜索一下有没有同名的包,防止冲突。
version
是版本号,更新的时候会寻找比当前版本更高的版本号,所以不要乱写。
description
是短描述,一般是一句话。
long_description
是长描述,详细的介绍。我直接读入了 README.md.
url
是你项目的地址。一般会填 github 地址。
py_modules
是库名,在里面填写你的库文件名即可。
install_requires
是这个包的所需的依赖。
classifiers
是分类。根据 PyPi Classifiers 填写,至少要包含所用的 Python 版本。
第三步——上传文件
最后的最后,用pip安装一下上传包的必要库:
python -m pip install --user --upgrade setuptools wheel
和
python -m pip install --user --upgrade twine
说明一下:setuptools
和wheel
用于构建项目;twine
用于上传文件至Pypi。
首先检查setup.py
语法是否正确:
python setup.py check
若没有错误,就可以构建项目
python setup.py sdist bdist_wheel
结果应该生成三个文件夹
/pgzero_template
----/pgzero_template.egg-info
----/dist
----/build
其中最重要的是dist
目录。
接下来就可以正式开始上传了
方法1
在cmd中输入如下代码:
twine upload --repository-url https://upload.pypi.org/legacy/ dist/*
输入Pypi的账户与密码即可
方法2
上个方法可能会报错,而且每次都要输入密码,很烦(大悲)
所以还有另个方法:
在C:\Users\用户名
创建文件.pypric
若无法创建,直接用cmd解决:
echo a 2>.pypric
在文件中写如下:
[distutils]
index-servers=pypi
[pypi]
repository = https://upload.pypi.org/legacy/
username: [username]
password: [password]
这样就可以直接输入cmd
twine upload dist/*
过一段时间,就上传成功惹!!!
尝试导入自己的项目
可以用pip来尝试安装自己的库。
python -m pip install pgzero-template
在用python测试一下:
from pgzero_template import *
def draw():
template_draw(screen)
def update():
template_update()
def on_key_down(key):
template_on_key_down(keys, key)
上传一个python包
很很很很很很简单~只需要稍加修改一下刚刚的文件即可
/pgzero_template
----/pgzero_template
--------/__init__.py
--------/和其他py文件……
----/以及我刚刚说过的文件……
同时setup.py
也需要一些修改:
from __future__ import print_function
from setuptools import setup, find_packages
import pgzero_template
with open("README.md", "r", encoding='utf-8') as fh:
long_description = fh.read()
setup(
name="pgzero_template",
version=pgzero_template.__version__,
author="xiaofengkz",
author_email="xiaofengkz@163.com",
description="a template for pgzero",
long_description=long_description,
long_description_content_type="text/markdown",
license="MIT",
url="https://github.com/zhec5hl01/python-games",
packages=find_packages(),
install_requires=[
"pgzero <= 1.2.1",
"pygame <= 2.1.2"
],
classifiers=[
"Topic :: Games/Entertainment ",
'Topic :: Games/Entertainment :: Puzzle Games',
'Topic :: Games/Entertainment :: Board Games',
"Topic :: Software Development :: Libraries :: Python Modules",
"Programming Language :: Python",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
'Programming Language :: Python :: Implementation :: CPython',
],
)
只需要py_modules
参数改为packages
,值改为find_packages()
函数。
结束语
咳咳……终于讲完了!这是我的第一个博客,可能有些不好,请谅解!希望本博客能为各位码农提供帮助!!!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)