【python教程】打包和釋出自己的專案,讓別人去pip

UnderTurrets發表於2024-08-24

@

目錄
  • 1.環境搭建
    • 1.1 換源
    • 1.2 安裝wheel
    • 1.3 安裝twine
    • 1.4 註冊PyPI賬號
  • 2.編寫setup.py
    • 2.1 專案檔案樹
    • 2.2 編寫setup.py檔案
  • 3.構建
  • 4.上傳
    • ERROR:The user 'XXX' isn't allowed to upload to project ''
    • 2024.1.19更新:


1.環境搭建

1.1 換源

  • 在pip安裝時使用-i引數,可以指定源。以下有許多種國內源可以選擇
https://pypi.tuna.tsinghua.edu.cn/simple
http://mirrors.aliyun.com/pypi/simple/
https://pypi.mirrors.ustc.edu.cn/simple/
http://pypi.hustunique.com/
http://pypi.sdutlinux.org/
http://pypi.douban.com/simple/

1.2 安裝wheel

pip install wheel -i https://pypi.tuna.tsinghua.edu.cn/simple

1.3 安裝twine

pip install twine -i https://pypi.tuna.tsinghua.edu.cn/simple

1.4 註冊PyPI賬號

此網址註冊一個即可

2.編寫setup.py

2.1 專案檔案樹

  • 你的專案可能是這樣的...
xu736946693@ubuntu:~/Desktop/python-template$ tree
.
├── bin
│   └── start.py
├── conf
│   └── yourfile.conf
├── dataBase
│   └── yourDB
├── docs
│   └── introduction.md
├── lib
│   └── yourlib.py
├── LICENSE
├── log
│   └── version.md
├── package_name
│   ├── __init__.py
│   └── module1
│       └── __init__.py
├── README.md
├── res
│   ├── READMEimgRes
│   │   ├── 7ac23192b1904eb790272d8462cec5b8.png
│   │   └── d919d615def3466f9ff73488c4e62aac.png
│   └── yourResource
│       └── resourceFile
├── settings.zip
├── setup.py
└── tests
    └── test.py

12 directories, 16 files

2.2 編寫setup.py檔案

setup.py檔案是用來打包和上傳你的包的重要檔案,它有固定的編寫正規化。下面我將給出我的demo並附上詳細註釋。

from setuptools import setup, find_packages
from os import path

this_directory = path.abspath(path.dirname(__file__))
with open(path.join(this_directory, 'README.md'), encoding='utf-8') as f:
    my_long_description = f.read()


setup(
    # 關於classifiers的描述詳見如下
    # https://pypi.org/search/?q=&o=&c=Topic+%3A%3A+Software+Development+%3A%3A+Build+Tools
    classifiers=[
        # 屬於什麼型別
        "Topic :: Software Development :: Libraries :: Python Modules",

        # 發展時期,常見的如下
        # Development Status:: 1 - Planning
        # Development Status:: 2 - Pre - Alpha
        # Development Status:: 3 - Alpha
        # Development Status:: 4 - Beta
        # Development Status:: 5 - Production / Stable
        # Development Status:: 6 - Mature
        # Development Status:: 7 - Inactive
        "Development Status :: 4 - Beta",

        # 許可證資訊
        "License :: OSI Approved :: MIT License",

        # 目標程式語言
        # Programming Language :: C
        # Programming Language :: C++
        # Programming Language :: Python :: 3.4
        # Programming Language :: Python :: 3.5
        # Programming Language :: Python :: 3.6
        # Programming Language :: Python :: 3.7
        # Programming Language :: Python :: 3.8
        # Programming Language :: Python :: 3.9
        "Programming Language :: Python :: 3",
        "Programming Language :: Python :: 3.3",
        "Programming Language :: Python :: 3.4",
        "Programming Language :: Python :: 3.5",
        "Programming Language :: Python :: 3.6",
        "Programming Language :: Python :: 3.7",
        "Programming Language :: Python :: 3.8",
        "Programming Language :: Python :: 3.9",

        # 執行的作業系統
        # "Operating System :: POSIX :: Linux",
        "Operating System :: Microsoft :: Windows",

        # 執行的環境
        # "Environment :: GPU :: NVIDIA CUDA :: 12",

        # 開發的目標使用者
        # Intended Audience :: Customer Service
        # Intended Audience :: Developers
        # Intended Audience :: Education
        # ...
        # Intended Audience :: End Users/Desktop
        # Intended Audience :: Financial and Insurance Industry
        # Intended Audience :: Healthcare Industry
        "Intended Audience :: End Users/Desktop",

        # 自然語言
        "Natural Language :: English",
        "Natural Language :: Chinese (Simplified)",

    ],

    # 如果上傳時出現ERROR:The user '' isn't allowed to upload to project '',換個名字,長一點無所謂,不能跟別人重複
    name="projectTemplate",
    version="1.0.0",
    author="Han Xu",
    author_email="736946693@qq.com",
    description="This is a project template.",
    long_description=my_long_description,

    # 存放原始碼的地址,填入gitee的原始碼網址即可
    # url="https://gitee.com/UnderTurrets/",

    packages=find_packages(),

    # README.md文字的格式,如果希望使用markdown語言就需要下面這句話
    long_description_content_type="text/markdown",

    # 安裝過程中,需要安裝的靜態檔案,如配置檔案、service檔案、圖片等
    # data_files=[
    #      ("", ["conf/*.conf"]),
    #      ("/usr/lib/systemd/system", ["bin/*.service"]),
    #            ],

    # 希望被打包的檔案
    # package_data={
    #     "":["*.txt"],
    #     "bandwidth_reporter":["*.txt"]
    #            },

    # 不打包某些檔案
    # exclude_package_data={
    #     "bandwidth_reporter":["*.txt"]
    #            },

    # 表明當前模組依賴哪些包,若環境中沒有,則會從pypi中下載安裝
    # install_requires=["requests",],

    # setup.py 本身要依賴的包,這通常是為一些setuptools的外掛準備的配置
    # 這裡列出的包,不會自動安裝。
    # setup_requires=["",],

    # 僅在測試時需要使用的依賴,在正常釋出的程式碼中是沒有用的。
    # 在執行python setup.py test時,可以自動安裝這三個庫,確保測試的正常執行。
    # tests_require=[
    #     "",
    # ],

    # install_requires 在安裝模組時會自動安裝依賴包
    # 而 extras_require 不會,這裡僅表示該模組會依賴這些包
    # 但是這些包通常不會使用到,只有當你深度使用模組時,才會用到,這裡需要你手動安裝
    # extras_require={
    #     "":  [""],
    # },
)
  • 根據自己的需要更改即可

3.構建

  • 在專案空間下執行如下指令:
python setup.py sdist bdist_wheel
  • 可以看到專案下會自動生成build目錄和lib目錄等:
xu736946693@ubuntu:~/Desktop/python-template$ tree -L 3
.
├── bin
│   └── start.py
├── build
│   ├── bdist.linux-x86_64
│   └── lib
│       └── package_name
├── conf
│   └── yourfile.conf
├── dataBase
│   └── yourDB
├── dist
│   ├── projectTemplate-1.0.0-py3-none-any.whl
│   └── projectTemplate-1.0.0.tar.gz
├── docs
│   └── introduction.md
├── lib
│   └── yourlib.py
├── LICENSE
├── log
│   └── version.md
├── package_name
│   ├── __init__.py
│   └── module1
│       └── __init__.py
├── projectTemplate.egg-info
│   ├── dependency_links.txt
│   ├── PKG-INFO
│   ├── SOURCES.txt
│   └── top_level.txt
├── README.md
├── res
│   ├── READMEimgRes
│   │   ├── 7ac23192b1904eb790272d8462cec5b8.png
│   │   └── d919d615def3466f9ff73488c4e62aac.png
│   └── yourResource
│       └── resourceFile
├── settings.zip
├── setup.py
└── tests
    └── test.py

4.上傳

  • 在專案空間下執行如下指令:
twine upload -u <the usrname of your PyPI account> -p <the password of your PyPI account> dist/<the files you want to upload> 
  • 如果你更新了程式碼,記得更新setup.py中的版本號,重新構建你的程式碼,再次上傳就好了。

ERROR:The user 'XXX' isn't allowed to upload to project ''

  • 你的軟體包名字是PyPI用以區分的唯一標識,因此必須全球唯一

如果上傳時出現ERROR:The user 'XXX' isn't allowed to upload to project '',換個名字,長一點無所謂,不能跟別人重複。

2024.1.19更新:

目前PyPI官方強制要求兩步驗證,同時關閉了在終端中輸入賬密上傳包的方式。目前需要在賬戶中設定API才可以上傳。

  1. 設定API

在這裡插入圖片描述

  1. 在家目錄建立.pypirc檔案。對於windows使用者,即'C:\Users\<Your name>\.pypirc。對於Linux使用者,即'~\.pypirc
  2. twine上傳
twine upload dist/*

本文由部落格一文多發平臺 OpenWrite 釋出!

相關文章