搜索
首页后端开发Python教程在 GitHub 上创建并发布私有 Python 包

介绍

作为软件工程师,我们经常发现自己在不同的模块和项目中重复使用代码。但让我们面对现实吧,这种重复带来了一个挑战:当我们需要调整或修复该代码时,我们必须在多个地方进行相同的更改。对于我们这些重视效率和自动化的人来说,解决方案很明确 - 创建一个可以在我们的项目中安装和使用的单独包。
然而,在处理机密代码时,我们不能简单地将包发布到像 PyPI 这样的公共存储库上。相反,我们需要将其部署到私有存储库,例如 GitHub 或 GitLab。这种方法使我们能够保持安全性,同时仍然受益于可重用包的便利性。

在本教程中,我们将指导您完成以下过程:

  1. 创建 Python 包
  2. 将包部署到私有存储库 (GitHub)
  3. 在虚拟环境(venv)中安装软件包

通过执行这些步骤,您将能够减少代码重复并简化项目中共享代码的维护。

注意:DRY 不仅仅代表“Don’t Repeat Yourself”——它也是一种生活方式的选择。

Create and Release a Private Python Package on GitHub

1. 设置项目结构

首先,让我们为 Python 包设置一个基本的项目结构:

my-package/
├── my_package/
│   ├── __init__.py
│   └── module1.py
├── setup.py
├── build.pipeline.yml
├── requirements.txt
├── .gitignore
├── README.md
├── MANIFEST.in
└── LICENSE

让我们来剖析一下我们的私有 Python 包。每个文件和目录在使我们的包正常运行和可安装方面发挥着至关重要的作用:

  • my-package/:这是我们项目的根目录。它就像一座房子,里面包含我们需要的所有房间(文件)。
  • my_package/:该子目录是实际 Python 代码所在的位置。为了清楚起见,它的名称与我们的包相同。
    • __init__.py:该文件使 Python 将目录视为包。它可以为空,也可以执行包的初始化代码。
    • module1.py:这是我们放置主要代码的地方。根据包的复杂程度,您可以拥有多个模块文件。
  • setup.py:将此视为我们包的说明手册。它包含有关我们的包的元数据(如其名称和版本)并列出其依赖项。该文件对于使我们的包可通过 pip 安装至关重要。
  • requirements.txt:该文件列出了我们的项目依赖的所有外部Python包。它就像 pip 的购物清单,准确地告诉它要安装什么才能使我们的包正常工作。
  • README.md:这是我们项目的欢迎垫。它通常是人们访问我们的 GitHub 存储库时看到的第一件事,因此我们用它来解释我们的包的用途、如何安装以及如何使用它。
  • .gitignore:该文件告诉 Git 要忽略哪些文件或目录。它可以方便地将编译的代码、临时文件或敏感信息保持在版本控制之外。
  • 许可证:此文件指定其他人如何使用、修改或分发我们的包。这对于开源项目至关重要,有助于保护我们的工作。
  • MANIFEST.in:此文件用于在我们的包分发中包含非 Python 文件。如果我们有需要包含的数据文件、文档或其他资源,我们会在此处列出。
  • build.pipeline.yml:此文件定义我们的持续集成/持续部署(CI/CD)管道。当我们将更改推送到 GitHub 存储库时,它会自动执行运行测试和构建包等任务。

2. 创建包代码

让我们在包中创建一个简单的模块。在 my_package/module1.py 中:

my-package/
├── my_package/
│   ├── __init__.py
│   └── module1.py
├── setup.py
├── build.pipeline.yml
├── requirements.txt
├── .gitignore
├── README.md
├── MANIFEST.in
└── LICENSE

在 my_package/__init__.py 中,我们将导入我们的模块:

class Hello:
    def __init__(self, name):
        self.name = name

    def greet(self):
        return f"Hello, {self.name}!"

3.创建setup.py

setup.py 文件对于打包我们的项目至关重要。这是一个基本示例:

from .module1 import Hello

4.创建requirements.txt

在我们的requirements.txt 文件中,我们包含了构建和分发包所需的依赖项:

from setuptools import setup, find_packages

with open('requirements.txt') as f:
    requirements = f.read().splitlines()

setup(
    name="my_package",
    version="0.1",
    include_package_data=True,
    python_requires='>=3.8',
    packages=find_packages(),
    setup_requires=['setuptools-git-versioning'],
    install_requires=requirements,
    author="Abdellah HALLOU",
    author_email="abdeallahhallou33@gmail.com",
    description="A short description of your package",
    long_description=open('README.md').read(),
    long_description_content_type="text/markdown",
    classifiers=[
        "Programming Language :: Python :: 3.8",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    version_config={
       "dirty_template": "{tag}",
    }
)

5. 构建和安装你的包

安装要求。为了简单起见,我们将使用 Python 虚拟环境。

setuptools==69.2.0
wheel
twine

构建我们的包:

python -m venv env
source env/bin/activate # for linux and mac
./env/Scripts/activate # for windows
pip install -r requirements.txt

要在本地安装我们的软件包以进行测试:

python setup.py sdist bdist_wheel

您可以使用 .gitignore 文件提交您的工作并忽略文件夹:

https://github.com/github/gitignore/blob/main/Python.gitignore

6. 使用标签在 GitHub 上发布包

要发布包,首先在项目 my-package/ 的根目录下创建一个 build.pipeline.yml 文件并提交。部署将使用 twine 完成,这是我们之前安装的库:

my-package/
├── my_package/
│   ├── __init__.py
│   └── module1.py
├── setup.py
├── build.pipeline.yml
├── requirements.txt
├── .gitignore
├── README.md
├── MANIFEST.in
└── LICENSE

如果您需要在模块安装中包含非 Python 文件,可以使用 MANIFEST.in 文件。此文件指定您的软件包分发中应包含哪些附加文件。

class Hello:
    def __init__(self, name):
        self.name = name

    def greet(self):
        return f"Hello, {self.name}!"

然后上传包:

from .module1 import Hello

7. 安装软件包

创建访问令牌:

  • 转到设置>;开发者设置> 个人访问令牌(经典) > 生成新令牌
  • 确保检查 write:packages 范围以授予必要的权限。

获得令牌后,请确保其安全,因为您将需要它来安装软件包。

在您的计算机上,您可以使用以下模板安装您的私有包:

from setuptools import setup, find_packages

with open('requirements.txt') as f:
    requirements = f.read().splitlines()

setup(
    name="my_package",
    version="0.1",
    include_package_data=True,
    python_requires='>=3.8',
    packages=find_packages(),
    setup_requires=['setuptools-git-versioning'],
    install_requires=requirements,
    author="Abdellah HALLOU",
    author_email="abdeallahhallou33@gmail.com",
    description="A short description of your package",
    long_description=open('README.md').read(),
    long_description_content_type="text/markdown",
    classifiers=[
        "Programming Language :: Python :: 3.8",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    version_config={
       "dirty_template": "{tag}",
    }
)

结论

干得好,你现在知道如何在 GitHub 上使用 Python 创建和部署自己的私有包了。

Github 存储库链接:https://github.com/ABDELLAH-Hallou/Private-Python-Package-Deployment

以上是在 GitHub 上创建并发布私有 Python 包的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
列表和阵列之间的选择如何影响涉及大型数据集的Python应用程序的整体性能?列表和阵列之间的选择如何影响涉及大型数据集的Python应用程序的整体性能?May 03, 2025 am 12:11 AM

ForhandlinglargedatasetsinPython,useNumPyarraysforbetterperformance.1)NumPyarraysarememory-efficientandfasterfornumericaloperations.2)Avoidunnecessarytypeconversions.3)Leveragevectorizationforreducedtimecomplexity.4)Managememoryusagewithefficientdata

说明如何将内存分配给Python中的列表与数组。说明如何将内存分配给Python中的列表与数组。May 03, 2025 am 12:10 AM

Inpython,ListSusedynamicMemoryAllocationWithOver-Asalose,而alenumpyArraySallaySallocateFixedMemory.1)listssallocatemoremoremoremorythanneededinentientary上,respizeTized.2)numpyarsallaysallaysallocateAllocateAllocateAlcocateExactMemoryForements,OfferingPrediCtableSageButlessemageButlesseflextlessibility。

您如何在Python数组中指定元素的数据类型?您如何在Python数组中指定元素的数据类型?May 03, 2025 am 12:06 AM

Inpython,YouCansspecthedatatAtatatPeyFelemereModeRernSpant.1)Usenpynernrump.1)Usenpynyp.dloatp.dloatp.ploatm64,formor professisconsiscontrolatatypes。

什么是Numpy,为什么对于Python中的数值计算很重要?什么是Numpy,为什么对于Python中的数值计算很重要?May 03, 2025 am 12:03 AM

NumPyisessentialfornumericalcomputinginPythonduetoitsspeed,memoryefficiency,andcomprehensivemathematicalfunctions.1)It'sfastbecauseitperformsoperationsinC.2)NumPyarraysaremorememory-efficientthanPythonlists.3)Itoffersawiderangeofmathematicaloperation

讨论'连续内存分配”的概念及其对数组的重要性。讨论'连续内存分配”的概念及其对数组的重要性。May 03, 2025 am 12:01 AM

Contiguousmemoryallocationiscrucialforarraysbecauseitallowsforefficientandfastelementaccess.1)Itenablesconstanttimeaccess,O(1),duetodirectaddresscalculation.2)Itimprovescacheefficiencybyallowingmultipleelementfetchespercacheline.3)Itsimplifiesmemorym

您如何切成python列表?您如何切成python列表?May 02, 2025 am 12:14 AM

SlicingaPythonlistisdoneusingthesyntaxlist[start:stop:step].Here'showitworks:1)Startistheindexofthefirstelementtoinclude.2)Stopistheindexofthefirstelementtoexclude.3)Stepistheincrementbetweenelements.It'susefulforextractingportionsoflistsandcanuseneg

在Numpy阵列上可以执行哪些常见操作?在Numpy阵列上可以执行哪些常见操作?May 02, 2025 am 12:09 AM

numpyallowsforvariousoperationsonArrays:1)basicarithmeticlikeaddition,减法,乘法和division; 2)evationAperationssuchasmatrixmultiplication; 3)element-wiseOperations wiseOperationswithOutexpliitloops; 4)

Python的数据分析中如何使用阵列?Python的数据分析中如何使用阵列?May 02, 2025 am 12:09 AM

Arresinpython,尤其是Throughnumpyandpandas,weessentialFordataAnalysis,offeringSpeedAndeffied.1)NumpyArseNable efflaysenable efficefliceHandlingAtaSetSetSetSetSetSetSetSetSetSetSetsetSetSetSetSetsopplexoperationslikemovingaverages.2)

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器