百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

零基础编程——Python模块项目打包发布PyPI,pip可安装

bigegpt 2024-08-04 11:19 16 浏览

摘要

书接前文:

01-《零基础编程——起步并搭建Python环境》及图书推荐

02-《零基础编程——变量与数据类型》

03-《零基础编程——Python循环、函数、类》

04-《零基础编程——Python文件、JSON数据存储》

05-《零基础编程——Python标准库使用》

本文将讲解Python模块打包封装成为第三方库并且及发布到pypi,可以使用pip安装使用

内容:

一 模块创建使用
    1-创建一个模块(文件),命名为:fibo.py
    2-调用使用模块
    3-将模块作为脚本执行
二 包创建使用 Python Package
    1-创建包
    2-为什么需要__init__.py文件?
三 打包Python项目为第三方库
    1-给包、项目添加setup.py文件并打包发布
    2-安装到python模块中
    3-使用自己刚才打包的模块
四 发布包到PyPI
    1-PyPi注册自己的账号
    2-校验我们打的包
    3-在用户目录下创建认证信息
    4-上传发布
    5-安装使用
五 技术总结及源码地址


一 模块创建使用

1-创建一个模块(文件),命名为:fibo.py

def fib(n):    # write Fibonacci series up to n
    a, b = 0, 1
    while a < n:
        print(a, end=' ')
        a, b = b, a+b
    print()

def fib2(n):   # return Fibonacci series up to n
    result = []
    a, b = 0, 1
    while a < n:
        result.append(a)
        a, b = b, a+b
    return result

2-调用使用模块

import fibo
fibo.fib(1000)
dir(fibo)#查看fibo模块的方法
fibo.__name__

from fibo import * #这种方式导入模块,这会导入除以下划线(_)开头的所有名称之外的所有名称,一般我们用这种方式导入。

为了加快模块的加载速度,Python将每个模块的编译版本缓存在__pycache__名称下的目录中,该版本对编译文件的格式进行编码;它通常包含Python版本号.而将模块作为执行脚本的方式执行,不会产生缓存。

3-将模块作为脚本执行

修改fibo.py的__name__方法,代码如下:

def fib(n):    # write Fibonacci series up to n
    a, b = 0, 1
    while a < n:
        print(a, end=' ')
        a, b = b, a+b
    print()

def fib2(n):   # return Fibonacci series up to n
    result = []
    a, b = 0, 1
    while a < n:
        result.append(a)
        a, b = b, a+b
    return result


if __name__ == "__main__":
    import sys
    fib(int(sys.argv[1]))
    

命令行进入该文件目录,并执行:python fibo.py 1000

格式为

python fibo.py <arguments>

运行结果如下:


二 包创建使用 Python Package


1-创建包

创建一个fibo文件夹,新建一个__init__.py文件,该__init__.py文件通常为空,也可以用__all__则将其模块函数名称的列表。同样建立子文件夹fibo1、fibo2,下面分别有__init__.py和fibo.py


fibo.py 代码:

def fib(n):    # write Fibonacci series up to n
    a, b = 0, 1
    while a < n:
        print(a, end=' ')
        a, b = b, a+b
    print()

def fib2(n):   # return Fibonacci series up to n
    result = []
    a, b = 0, 1
    while a < n:
        result.append(a)
        a, b = b, a+b
    return result


if __name__ == "__main__":
    import sys
    fib(int(sys.argv[1]))
    

调用包(使用)

#方式1
import fibo.fibo1.fibo 
fibo.fibo1.fibo.fib(1000)
#方式2
from fibo.fibo1.fibo import fib
fib(1000)

分析:

Python的package有两种方式:regular packages、 namespace packages.

regular package的方式需要有个__init__.py文件,当导入包时候会隐式执行__init__.py文件,该文件可以绑定包空间里面的方法名称、以及包含其他模块属性。一般都是空的,表示改包下面的所有方法。如果没有该文件,删除该__init__.py文件,Python将不再在该目录中查找子模块,因此尝试导入该模块将失败。

2-为什么需要__init__.py文件?

为方便起见:其他用户将不需要知道您的函数在包层次结构中的确切位置

your_package/
  __init__.py
  file1.py
  file2.py
    ...
  fileN.py
# in __init__.py
from file1 import *
from file2 import *
...
from fileN import *
# in file1.py
def add():
    pass
    
 然后其他人可以通过以下方式调用add()
from your_package import add
不知道file1,例如
from your_package.file1 import add

如果您想初始化一些东西;例如,日志记录(应放在顶层):

import logging.config
logging.config.dictConfig(Your_logging_config)


三 打包Python项目为第三方库

1-给包、项目添加setup.py文件并打包发布

准备setup.py/setup.conf文件,它是放在你包的根目录的,这一步至关重要,包括要发布的包名字,版本,license,描述,特性(classifier)等等

setup.py格式如下:

from setuptools import setup, find_packages

setup(
    name='<项目的名称>',
    version='<项目版本>',
    description=(
        '<项目的简单描述>'
    ),
    long_description=open('README.rst').read(),
    author='<你的名字>',
    author_email='<你的邮件地址>',
    maintainer='<维护人员的名字>',
    maintainer_email='<维护人员的邮件地址',
    license='MIT License',
    packages=find_packages(),
    platforms=["all"],
    url='<项目的网址,一般都是github的url>',
    classifiers=[
        'Development Status :: 4 - Beta',
        'Operating System :: OS Independent',
        'Intended Audience :: Developers',
        'License :: OSI Approved :: MIT License',
        'Programming Language :: Python',
        'Programming Language :: Python :: Implementation',
        'Programming Language :: Python :: 2',
        'Programming Language :: Python :: 2.7',
        'Programming Language :: Python :: 3',
        'Programming Language :: Python :: 3.4',
        'Programming Language :: Python :: 3.5',
        'Programming Language :: Python :: 3.6',
        'Topic :: Software Development :: Libraries'
    ],
)

我们的setup.py内容如下:

from setuptools import setup, find_packages

setup(
    name="fibo",
    version="0.0.1",
    description=(
        "freso-studio,test packaging fibo"
    ),
    long_description=open("README.rst").read(),
    author="freostudio",
    author_email="1600690028@qq.com",
    maintainer="freostudio",
    maintainer_email="1600690028@qq.com",
    packages=find_packages(),
    url="https://github.com/freostudio/fibo",
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
)

最终我们整个fibo的项目结构如下:


进入命令行控制台:进入该目录,打包一个源代码的包执行

#1-生产tar.gz的包
python setup.py sdist build
#2-或者执行生产wheels格式的包
python setup.py bdist_wheel --universal



执行完后:会新增dist文件夹及test-fibo-0.0.1.tar.gz



fibo-0.0.1.tar.gz是我们可以安装的第三方库了


2-安装到python模块中

(可以拷贝到其他电脑测试使用)

test_fibo-0.0.1.tar.gz,命令行进入该目录,执行:

pip install fibo-0.0.1.tar.gz


3-使用自己刚才打包的模块

任意路径进入命令行

执行:

python
#调用模块方式1
import fibo.fibo1.fibo 
fibo.fibo1.fibo.fib(1000)
#调用模块方式2
from fibo.fibo1.fibo import fib
fib(1000)


四 发布包到PyPI

1-PyPi注册自己的账号

正式发布:

https://pypi.org/

测试发布:

https://test.pypi.org/

2-校验我们打的包

再包目录下执行命令python3 setup.py check

没有报错即可,输出一般是running check,如果有错误或者警告,就会在此之后显示.没有任何显示表示Distutils认可你这个setup.py文件


3-在用户目录下创建认证信息

windows路径:/user/用户名/新建文件.pypirc文件

[distutils]
index-servers =
  pypi
  pypitest

[pypi]
repository: https://upload.pypi.org/legacy/
username: your_username
password: your_password

[pypitest]
repository: https://test.pypi.org/legacy/
username: your_username
password: your_password

4-上传发布

进入刚才我们打包的路径下执行命令

python setup.py sdist upload -r pypitest
##成功上传测试环境后再执行发布到正式环境
python3 setup.py sdist upload -r pypi

执行结果如下:


报错:

Upload failed (403): The user 'freostudio' isn't allowed to upload to project 'fibo'. See https://test.pypi.org/help/#project-name for more information.
error: Upload failed (403): The user 'freostudio' isn't allowed to upload to project 'fibo'. See https://test.pypi.org/help/#project-name for more information.

到测试环境查fibo发现已经存在了,https://test.pypi.org/search/?q=fibo

只好我们换个包名:freostudio_fibo


到我们账号下面去查看package:已经上传成功

https://test.pypi.org/project/freostudio_fibo/



5-安装使用

我们先从测试环境中下载包看看

pip download freostudio_fibo -i https://test.pypi.org/simple/


安装到本地使用:

pip install freostudio_fibo -i https://test.pypi.org/simple/

成功安装

测试使用:

python
#调用模块方式1
import freostudio_fibo.fibo1.fibo  as fb
fb.fib(1000)
#调用模块方式2
from freostudio_fibo.fibo1.fibo import fib 
fib(1000)

成功调用

五 总结

学会创建模块、包,并且编译打包成安装包,注册PyPI账号,并且发布上传自己的包给别人用。

最后献上源码:https://github.com/freostudio/fibo

相关推荐

当Frida来“敲”门(frida是什么)

0x1渗透测试瓶颈目前,碰到越来越多的大客户都会将核心资产业务集中在统一的APP上,或者对自己比较重要的APP,如自己的主业务,办公APP进行加壳,流量加密,投入了很多精力在移动端的防护上。而现在挖...

服务端性能测试实战3-性能测试脚本开发

前言在前面的两篇文章中,我们分别介绍了性能测试的理论知识以及性能测试计划制定,本篇文章将重点介绍性能测试脚本开发。脚本开发将分为两个阶段:阶段一:了解各个接口的入参、出参,使用Python代码模拟前端...

Springboot整合Apache Ftpserver拓展功能及业务讲解(三)

今日分享每天分享技术实战干货,技术在于积累和收藏,希望可以帮助到您,同时也希望获得您的支持和关注。架构开源地址:https://gitee.com/msxyspringboot整合Ftpserver参...

Linux和Windows下:Python Crypto模块安装方式区别

一、Linux环境下:fromCrypto.SignatureimportPKCS1_v1_5如果导包报错:ImportError:Nomodulenamed'Crypt...

Python 3 加密简介(python des加密解密)

Python3的标准库中是没多少用来解决加密的,不过却有用于处理哈希的库。在这里我们会对其进行一个简单的介绍,但重点会放在两个第三方的软件包:PyCrypto和cryptography上,我...

怎样从零开始编译一个魔兽世界开源服务端Windows

第二章:编译和安装我是艾西,上期我们讲述到编译一个魔兽世界开源服务端环境准备,那么今天跟大家聊聊怎么编译和安装我们直接进入正题(上一章没有看到的小伙伴可以点我主页查看)编译服务端:在D盘新建一个文件夹...

附1-Conda部署安装及基本使用(conda安装教程)

Windows环境安装安装介质下载下载地址:https://www.anaconda.com/products/individual安装Anaconda安装时,选择自定义安装,选择自定义安装路径:配置...

如何配置全世界最小的 MySQL 服务器

配置全世界最小的MySQL服务器——如何在一块IntelEdison为控制板上安装一个MySQL服务器。介绍在我最近的一篇博文中,物联网,消息以及MySQL,我展示了如果Partic...

如何使用Github Action来自动化编译PolarDB-PG数据库

随着PolarDB在国产数据库领域荣膺桂冠并持续获得广泛认可,越来越多的学生和技术爱好者开始关注并涉足这款由阿里巴巴集团倾力打造且性能卓越的关系型云原生数据库。有很多同学想要上手尝试,却卡在了编译数据...

面向NDK开发者的Android 7.0变更(ndk android.mk)

订阅Google官方微信公众号:谷歌开发者。与谷歌一起创造未来!受Android平台其他改进的影响,为了方便加载本机代码,AndroidM和N中的动态链接器对编写整洁且跨平台兼容的本机...

信创改造--人大金仓(Kingbase)数据库安装、备份恢复的问题纪要

问题一:在安装KingbaseES时,安装用户对于安装路径需有“读”、“写”、“执行”的权限。在Linux系统中,需要以非root用户执行安装程序,且该用户要有标准的home目录,您可...

OpenSSH 安全漏洞,修补操作一手掌握

1.漏洞概述近日,国家信息安全漏洞库(CNNVD)收到关于OpenSSH安全漏洞(CNNVD-202407-017、CVE-2024-6387)情况的报送。攻击者可以利用该漏洞在无需认证的情况下,通...

Linux:lsof命令详解(linux lsof命令详解)

介绍欢迎来到这篇博客。在这篇博客中,我们将学习Unix/Linux系统上的lsof命令行工具。命令行工具是您使用CLI(命令行界面)而不是GUI(图形用户界面)运行的程序或工具。lsoflsof代表&...

幻隐说固态第一期:固态硬盘接口类别

前排声明所有信息来源于网络收集,如有错误请评论区指出更正。废话不多说,目前固态硬盘接口按速度由慢到快分有这几类:SATA、mSATA、SATAExpress、PCI-E、m.2、u.2。下面我们来...

新品轰炸 影驰SSD多款产品登Computex

分享泡泡网SSD固态硬盘频道6月6日台北电脑展作为全球第二、亚洲最大的3C/IT产业链专业展,吸引了众多IT厂商和全球各地媒体的热烈关注,全球存储新势力—影驰,也积极参与其中,为广大玩家朋友带来了...