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

在 GitHub 上创建并发布私有 Python 包

Oct 20, 2024 pm 10:18 PM

介绍

作为软件工程师,我们经常发现自己在不同的模块和项目中重复使用代码。但让我们面对现实吧,这种重复带来了一个挑战:当我们需要调整或修复该代码时,我们必须在多个地方进行相同的更改。对于我们这些重视效率和自动化的人来说,解决方案很明确 - 创建一个可以在我们的项目中安装和使用的单独包。
然而,在处理机密代码时,我们不能简单地将包发布到像 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

热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

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

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

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

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何在使用 Fiddler Everywhere 进行中间人读取时避免被浏览器检测到? 如何在使用 Fiddler Everywhere 进行中间人读取时避免被浏览器检测到? Apr 02, 2025 am 07:15 AM

使用FiddlerEverywhere进行中间人读取时如何避免被检测到当你使用FiddlerEverywhere...

在Linux终端中使用python --version命令时如何解决权限问题? 在Linux终端中使用python --version命令时如何解决权限问题? Apr 02, 2025 am 06:36 AM

Linux终端中使用python...

如何在10小时内通过项目和问题驱动的方式教计算机小白编程基础? 如何在10小时内通过项目和问题驱动的方式教计算机小白编程基础? Apr 02, 2025 am 07:18 AM

如何在10小时内教计算机小白编程基础?如果你只有10个小时来教计算机小白一些编程知识,你会选择教些什么�...

如何绕过Investing.com的反爬虫机制获取新闻数据? 如何绕过Investing.com的反爬虫机制获取新闻数据? Apr 02, 2025 am 07:03 AM

攻克Investing.com的反爬虫策略许多人尝试爬取Investing.com(https://cn.investing.com/news/latest-news)的新闻数据时,常常�...

Python 3.6加载pickle文件报错ModuleNotFoundError: No module named '__builtin__'怎么办? Python 3.6加载pickle文件报错ModuleNotFoundError: No module named '__builtin__'怎么办? Apr 02, 2025 am 06:27 AM

Python3.6环境下加载pickle文件报错:ModuleNotFoundError:Nomodulenamed...

使用Scapy爬虫时,管道文件无法写入的原因是什么? 使用Scapy爬虫时,管道文件无法写入的原因是什么? Apr 02, 2025 am 06:45 AM

使用Scapy爬虫时管道文件无法写入的原因探讨在学习和使用Scapy爬虫进行数据持久化存储时,可能会遇到管道文�...

See all articles