当前位置: 首页 > 科技观察

六步打包你最喜欢的Python代码

时间:2023-03-14 18:25:04 科技观察

假设你喜欢使用同一段Python代码加上几个相关的小功能,或者一个中等大小的模块只有几百行代码。程序员可以将其复制到不同的项目或存储库中,或者从专门设置的实用程序代码文件夹中导入此代码。这个是正常的。程序员在写代码的过程中,会不断积累这些个性化的小玩意。在Python中积累这些语句比在其他编程语言中更容易——这些代码非常实用。如果您可以轻松导入自己的小工具并在不复制它们的情况下更新和维护它们,那不是很好吗?如果你不依赖特定的文件或路径,让这些代码在不同的环境、机器和上下文中工作。适用的?如果可以对这些个性化工具进行版本控制并且关联的代码清楚地反映它们的依赖关系会怎么样?如果可以让大众使用该工具会怎样?是的,它可以。当然,这不是第一次提到这个概念。这就是为什么模块、包和库在编程语言中普遍使用的原因,尤其是在Python的开发环境中。它的实现可以让Python更加强大;只需简单的pipinstall和import即可获得BeautifulSoup的html解析功能或pandas的数据框处理功能。此外,每个人都可以在PyPI上编写和发布自己的代码(PyPI是Python包的官方索引:http://pypi.python.org/pypi),使其兼容sklearn、requests或delorean(都非常实用和流行)Python包)同样容易获得。以下是它的一些优点:即使很少有人使用它,分享您的代码仍然很有趣;程序员可以在工作、社区活动或求职面试中分享和展示他们的劳动成果。通过强制组织和记录您的代码并打开它以供同行评审来改进您的代码。这也弥补了社区的不足。你会惊讶有多少人会注意到你的序列化是多么高效,比如将HTTP标头序列化为JSON。或者发现您创建的用于验证输入到MongoDB查询中的文档修饰符的工具有多么有用。有兴致?忘记那个旧的Python模块,开始制作小的Python包。图1:Python灰尘第1步:命名首先是命名。好的名字通常足够短,可以在pipinstall或import完成后输入(尽管现在出现了“autotype”);requests负责处理HTTP请求,delorean负责日期和时间,sklearn负责提供机器学习框架,这些都是很好的例子。对于pandas管道包(因为pandas通常使用像pd这样的短别名导入,使用pdpipe:https://github.com/shaypal5/pdpipe)和缓存包(cachier:https://github.com/shaypal5/cachier)命名,作者也尝试了这些例子。但老实说,这些并不是硬性规定。流行的Python包有pandas、keras、django、boto、jinja、flask和pytorch等名字,人们会记住这些名字,所以读者可以使用简短易读的名字(例如,由于可读性问题,作者缩写为“Scikit-LearnFastText的包装”作为skift)。本文以陆行鸟为例。第二步:确定代码包的基本结构接下来通过几个简短的步骤,做一个通用的结构:1.创建一个Githubrepository,名字和代码包完全一样,不要使用驼峰命名法或者个人玩法太多。然后在本地复制一份。2.在该存储库中创建一个新文件夹,以代码包的确切名称命名;这是保存代码包的文件夹。这是约定,请记住外部chocobo文件夹(在本例中)是存储库的文件夹,内部chocobo文件夹是包的文件夹。3.将你自己的模块和任何其他涉及的模块放在内部chocobo文件夹中。如果缺少一块,请添加__init__.py文件。4.将用户从各自模块中直接调用的重要对象(通常是函数)导入到__init__.py文件中。有了代码包的命名空间,就可以使用这些函数、类和变量。如果您愿意,也可以使用代码包的API。5.虽然不是强制性的,但作者强烈建议在代码包或仓库根目录下包含一个.gitignore文件。示例:https://github.com/github/gitignore/blob/master/Python.gitignore现在有一个结构,可以添加不同类型的文件,形成一个代码包;内部文件夹保存包的代码,外部文件夹保存的是辅助包文件和其他存储库相关文件。所以初始模块chocobo.py看起来像这样:"""Mychocobocookingscript."""importosdefchocobo_roast(num_guests,hotness_level):#amazingpythoncodehere新的存储库文件夹看起来像这样:chocobo/chocobo/__init__.pychocobo.py.gitignore__init__.py文件应该是这样的:"""chocoboisapythonpackagefordeliciousChocoborecipes."""from.chocoboimport(chocobo_roast,)然后打包完成后,chocobo包可以这样使用:"""I'mascriptoradifferentpackageusingchocobo."""importchococbodefmy_feast(num_guests):snacks=bobbish()main_course=chocobo.chocobo_roast(num_guests,0)dressing=szechuan_chicken_mcnugget_sauce()以上是一些重点。第3步:许可问题最好使用共享许可发布代码;如果你想公开分享你的代码,程序员会希望在保留版权的前提下获得重用代码的许可,或者让扩展他们代码的人保证衍生代码可以自由使用。获得许可证可以轻松解决这些问题。对于琐碎的项目,请考虑MIT许可证(https://choosealicense.com/licenses/mit/)。choosealicense.com(https://choosealicense.com/)提供了大量来自GitHub和开源社区的实用建议。无论您选择哪种许可证,总比没有好。很多时候,未经许可发布代码比不发布更糟糕;如果程序员不明确表示他们拥有代码,大多数公司会因为可能的法律纠纷而放弃,从而失去许多潜在用户。选择许可证后,在存储库中创建一个LICENSE许可证文件(不需要文件扩展名)并导入所选许可证的确切文本。第四步:设置文件现在创建Python打包工具所需的基本文件(以setuptools为例);setup.py.setup.py包含构建和分发时使用的实际指令。这是一个初始模板(别担心,我稍后会检查它)"ShayPalachy",author_email="shay.palachy@gmail.com",name='chocobo',license="MIT",description='chocoboisapythonpackagefordeliciouschocoborecipes.',version='v0.0.3',long_description=README,url='https://github.com/shaypal5/chocobo',packages=setuptools.find_packages(),python_requires=">=3.5",install_requires=['requests'],classifiers=[#Troveclassifiers#(https://pypi.python.org/pypi?%3Aaction=list_classifiers)'DevelopmentStatus::4-Beta','License::OSIApproved::MITLicense','ProgrammingLanguage::Python','ProgrammingLanguage::Python::3.5','ProgrammingLanguage::Python::3.6','Topic::SoftwareDevelopment::Libraries','Topic::SoftwareDevelopment::Libraries::PythonModules','IntendedAudience::Developers',],)首先,导入设置工具。这是一个非常有用的代码包,用于轻松分发Python包,即使它不包含在标准库中(类似的distutils无法比拟),它仍然是当今Python包分发的标准,应该牢记在心。本文只用到了setuptools包中的两个函数:setup和find_packagges。导入setuptools后调用setup()函数前,将README.md文件内容读入全局变量README即可。然后只需使用以下变量调用setuptools.setup()函数:author:输入名称。author_email:输入电子邮件地址。name:代码包的名称,在本例中为“chocobo”。许可证:在本例中为字符串“MIT”,或选择其他许可证。description:代码包的简单介绍,控制在一行之内。例如:“Thechocobocodepackageisarecipeformakingdeliciouschocobo”版本:表示包当前版本的字符串。作者会在后面的文章中介绍更简洁的处理方式,但目前只需要在发布新版本时手动增加一个数字即可。通常的做法是在版本号前加上字母V,因此v1是版本字符串的第一个版本,但我建议将v0.0.1视为等效版本字符串并使用这种格式。稍后将详细描述这种方法的意义。long_description:表示README的内容。本节是对代码包的详细说明。这就是PyPI页面的内容(示例:https://pypi.org/project/pdpipe/)。url:代码包首页链接。如果读者没有专用站点,则存储库的URL是一个不错的选择。packages:再次提到setuptools!根据命令,该参数获取所有待构建和发布/安装的代码包的名称数组。从技术上讲,名称["chocobo"]可以直接使用,但最好将其概括并使用setuptools函数,它可以处理更复杂的包和存储库结构。有两个可选参数可以作为输入数据,where和exclude,这里忽略。结果,where链接到安装文件所在目录,包括所有子目录,一般就够用了。python_requires:如果你的电脑支持所有版本的Python,就不必考虑这个参数。如果不是,则应选择适当的值。从技术上讲,作者不赞成使用未经测试的版本,但在保险期间我们可以做出适当的假设:(1)如果读者使用的是Python2,尤其是Python2.7,可以得出以下两个结论:(a)你是独一无二的优秀(b)你的电脑配置只需要支持Python2.7,所以你可以使用字符“>=2.7”来编辑这个参数。另外,时代在进步,试试Python3。(2)如果读者使用的是Python3,那么任何一个Python版本都大于等于开发代码包所用的版本。以此类推,如果使用Python3.5,应该设置为“>=3.5”。install_requires:这里列出了所有非标准库代码包的先决条件。比如chocobo需要requests和pytz才能运行,那么这个参数应该设置为:["requests","pytz"]。分类器:与数以千计的其他包一起,您的包将很快在PyPI上可用。为了区分,作者可以为PyPI提供一个trove分类器列表来对每个版本进行分类,描述其目的、支持的系统和开发进度。然后社区成员可以使用这些标准化分类器根据他们的需要查找项目(尽管不确定谁会这样做)。以下是所有可能的分类器:https://pypi.python.org/pypi?%3Aaction=list_classifiers建议从以下内容开始:“DevelopmentStatus::3—Alpha”“License::OSIApproved::MITLicense""编程语言::Python""编程语言::Python::3.5""编程语言::Python::3.6""编程语言::Python::3.7""主题::软件开发::库""主题::SoftwareDevelopment::Libraries::PythonModules""IntendedAudience::Developers"这就是本节的全部内容。图2:选择trove分类器后的AceVentura步骤5:创建发布文件Python包位于release文件,这些文件会被上传到一个服务器(通常是PyPI全球服务器)供公众下载。关于发布格式本文不做赘述,作者将使用标准方式(https://packaging.python.org/tutorials/packaging-projects/)来构建两个文件:源分发文件(其中基础cally包含代码包)和wheelbuild分发文件(wheelbuilddistributionfile)。首先,确保您安装了最新版本的setuptools和wheel:python3-mpipinstall--user--upgradesetuptoolswheel要构建发布文件,只需在setup.py所在的存储库的根目录中运行以下命令:pythonsetup.pysdistbdist_wheel这一步需要Python运行setup.py脚本,给它发送两个参数生成源文件(参数sdist),wheel工具构建分发文件(参数bdist_wheel)。运行此命令时,将在调用目录中创建三个文件夹:build、dist和chocobo.egg-info。对于.gitignore文件,这三个可以忽略。如果这些目录已经存在(比如之前运行过命令,最好用rm-rfbuilddist删除这些目录,因为dist下任何有效的代码包文件都会被上传。要上传的两个文件位于dist文件夹:chocobo-0.0.3-py-none.any.whl(构建版本;是一个wheel文件)和chocobo-0.0.3.tar.gz(源版本;是一个压缩的tar文件))。创建成功后,我们继续上传步骤!第六步:上传剩下的步骤就是将代码包上传到PyPI全球服务器!但是,用户必须先在PyPI网站上注册。按照注册步骤填写用户名和密码。程序员如果想在上传到PyPI全球服务器之前测试包,也可以在测试PyPI网站上注册一个用户。现在,用于上传的Python包将在.pypirc文本文件中查找PyPI用户名和密码(通过PyPI服务器验证),该文件通常位于主文件夹中。创建完成后,填写如下(testpypi部分视具体情况而定):/username:teapot48password:MYtestPYPIpassword这篇文章按照最新的方法上传文件到PyPI服务器,使用twine(一个上传Python包的工具),而不是使用过时的pythonsetup.pyupload。只需运行:twineuploaddist/*如果你想在PyPI服务器上测试它,只需运行twineupload--repositorytestpypidist/*无论哪种方式,你应该在上传.whl文件时看到一个进度条,上传.tar.当您gz文件时,您还应该看到一个进度条,然后上传完成。现在你可以在PyPI官网看到自己的Python包页面了,大家也都可以看到了!示例:https://pypi.org/project/birch/图3:PyPI网站上的包页面示例大功告成!