Linux中國

如何打包你的 Python 代碼

你花了幾周的時間來完善你的代碼。你已經對它進行了測試,並把它發送給一些親近的開發者朋友以保證質量。你已經將所有的源代碼發布在 你的個人 Git 伺服器 上,並且從一些勇敢的早期使用者收到了一些有用的錯誤報告。現在你已經準備好將你的 Python 代碼提供給全世界。

就在這時你遇到一個問題。你不知道如何交付產品。

將代碼交付給它的目標用戶是一件大事。這是軟體開發的一個完整的分支,是 CI/CD 中的 「D」,但很多人都忘記了,至少到最後才知道。我寫過關於 AutotoolsCmake 的文章,但有些語言有自己的方法來幫助你將你的代碼提供給用戶。對於 Python 來說,向用戶提供代碼的一個常見方法是使用 setuptools

安裝 setuptools

安裝和更新 setuptools 的最簡單方法是使用 pip

$ sudo python -m pip install --upgrade setuptools

示例庫

我創建了一個簡單的 Python 庫,名為 myhellolib,來作為需要打包的示例代碼。這個庫接受一個字元串,然後用大寫字母列印出這個字元串。

它只有兩行代碼,但項目結構很重要,所以首先創建目錄樹:

$ mkdir -p myhellolib.git/myhellolib

為了確認這個項目是一個可導入的庫(即 Python 「模塊」),在代碼目錄中創建一個空文件 __init__.py,同時創建一個包含代碼的文件:

$ touch myhellolib.git/myhellolib/__init__.py
$ touch myhellolib.git/myhellolib/myhellolib.py

myhellolib.py 文件中,輸入簡單的 Python 代碼:

def greeter(s):
    print(s.upper())

這就是寫好的庫。

測試它

打包之前,測試一下你的庫。創建一個 myhellolib.git/test.py 文件並輸入以下代碼:

import myhellolib.myhellolib as hello
hello.greeter("Hello Opensource.com.")

運行該腳本:

$ cd myhellolib.git
$ python ./test.py
HELLO OPENSOURCE.COM

它可以工作,所以現在你可以把它打包了。

Setuptools

要用 setuptools 打包一個項目,你必須創建一個 .toml 文件,將 setuptools 作為構建系統。將這段文字放在項目目錄下的 myhellolib.toml 文件中。

[build-system]
requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta"

接下來,創建一個名為 setup.py 的文件,包含項目的元數據:

from setuptools import setup

setup(
   name='myhellolib',
   version='0.0.1',
   packages=['myhellolib'],
   install_requires=[
      'requests',
      'importlib; python_version == "3.8"',
   ],
)

不管你信不信,這就是 setuptools 需要的所有設置。你的項目已經可以進行打包。

打包 Python

要創建你的 Python 包,你需要一個構建器。一個常見的工具是 build,你可以用 pip 安裝它:

$ python -m pip install build --user

構建你的項目:

$ python -m build

過了一會兒,構建完成了,在你的項目文件夾中出現了一個新的目錄,叫做 dist。這個文件夾包含一個 .tar.gz 和一個 .whl 文件。

這是你的第一個 Python 包! 下面是包的內容:

$ tar --list --file dist/myhellolib-0.0.1.tar.gz
myhellolib-0.0.1/
myhellolib-0.0.1/PKG-INFO
myhellolib-0.0.1/myhellolib/
myhellolib-0.0.1/myhellolib/__init__.py
myhellolib-0.0.1/myhellolib/myhellolib.py
myhellolib-0.0.1/myhellolib.egg-info/
myhellolib-0.0.1/myhellolib.egg-info/PKG-INFO
myhellolib-0.0.1/myhellolib.egg-info/SOURCES.txt
myhellolib-0.0.1/myhellolib.egg-info/dependency_links.txt
myhellolib-0.0.1/myhellolib.egg-info/requires.txt
myhellolib-0.0.1/myhellolib.egg-info/top_level.txt
myhellolib-0.0.1/setup.cfg
myhellolib-0.0.1/setup.py

$ unzip -l dist/myhellolib-0.0.1-py3-none-any.whl 
Archive:  dist/myhellolib-0.0.1-py3-none-any.whl
Name
-myhellolib/__init__.py
myhellolib/myhellolib.py
myhellolib-0.0.1.dist-info/METADATA
myhellolib-0.0.1.dist-info/WHEEL
myhellolib-0.0.1.dist-info/top_level.txt
myhellolib-0.0.1.dist-info/RECORD
----6 files

讓它可用

現在你知道了打包你的 Python 包是多麼容易,你可以使用 Git 鉤子、GitLab Web 鉤子、Jenkins 或類似的自動化工具來自動完成這個過程。你甚至可以把你的項目上傳到 PyPi,這個流行的 Python 模塊倉庫。一旦它在 PyPi 上,用戶就可以用 pip 來安裝它,就像你在這篇文章中安裝 setuptoolsbuild 一樣!

當你坐下來開發一個應用或庫時,打包並不是你首先想到的事情,但它是編程的一個重要方面。Python 開發者在程序員如何向世界提供他們的工作方面花了很多心思,沒有比 setuptools 更容易的了。試用它,使用它,並繼續用 Python 編碼!

via: https://opensource.com/article/21/11/packaging-python-setuptools

作者:Seth Kenlon 選題:lujun9972 譯者:geekpi 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    這個站點使用 Akismet 來減少垃圾評論。了解你的評論數據如何被處理

    More in:Linux中國

    Linux中國

    捐贈 Let's Encrypt,共建安全的互聯網

    隨著 Mozilla、蘋果和谷歌對沃通和 StartCom 這兩家 CA 公司處罰落定,很多使用這兩家 CA 所簽發證書的網站紛紛尋求新的證書籤發商。有一個非盈利組織可以為大家提供了免費、可靠和安全的 SSL 證書服務,這就是 Let's Encrypt 項目。現在,它需要您的幫助
    Linux中國

    關於Linux防火牆iptables的面試問答

    Nishita Agarwal是Tecmint的用戶,她將分享關於她剛剛經歷的一家公司(印度的一家私人公司Pune)的面試經驗。在面試中她被問及許多不同的問題,但她是iptables方面的專家,因此她想分享這些關於iptables的問題和相應的答案給那些以後可能會進行相關面試的人。 所有的問題和相應的答案都基於Nishita Agarwal的記憶並經過了重寫。 嗨,朋友!我叫Nishita Agarwal。我已經取得了理學學士學位,我的專業集中在UNIX和它的變種(BSD,Linux)。它們一直深深的吸引著我。我在存儲方面有1年多的經驗。我正在尋求職業上的變化,並將供職於印度的P
    Linux中國

    Lets Encrypt 已被所有主流瀏覽器所信任

    旨在讓每個網站都能使用 HTTPS 加密的非贏利組織 Lets Encrypt 已經得了 IdenTrust的交叉簽名,這意味著其證書現在已經可以被所有主流的瀏覽器所信任。從這個裡程碑事件開始,訪問者訪問使用了Lets Encrypt 證書的網站不再需要特別配置就可以得到 HTTPS 安全保護了。 Lets Encrypt 的兩個中級證書 ...