Upload Python Project to PyPI

發生了什麼事

事情是這樣的,我打算照著《深入淺出 Python》這本書學習Python。到第二章時要開始上傳module到PyPI (Python Package Index, PyPI)。這邊開始發現有一系列需要更新的地方,表列如下:

  1. PyPI的網址已經修改為 https://pypi.org
  2. 使用命令提示字元(cmd.exe),最好使用管理員身分執行。在建立要上傳檔案時會新增檔案,因此需要管理員身分。
  3. 在windows環境下,直接使用 py 就可以取代 python.exe。其他環境我沒試過。
  4. PyPI註冊帳號的頁面已經跟書中不同,現在沒有欄位給你提供PGP金鑰。
  5. 上傳程式到PyPI會出現error。因為書中是使用 setup.py register 與 setup.py sdist upload。書中說要再註冊一次,我認為用字不夠精準。應該說是登入帳號才對。

因為照著書中的方式會無法上傳module到PyPI,因此我就開始尋找解答。依照目前查詢的結果,PyPI官方建議使用twine這個package。但是我的系統中沒有,所以就必須要學習如何安裝package。

無法上傳的錯誤情況

首先我先到nester資料夾中,然後給出command: py setup.py register,接著利用現有帳戶登入後,會出現: Server response(410): Project Pre-registration is no longer required or supported, upload your files instead. 以及下列的錯誤訊息:

於是我緊接著到 [1] 去看,說是帳號密碼登入錯誤,不過我很明確我給的是對的。於是我就繼續用google搜尋,找到[2]。在[2]裡請提問者看[3]的說明。[3]是PyPI上傳檔案的說明,可以發現PyPI官方並不推薦使用 setup.py register setup.py upload 指令。

解決方案

在[3]中,我們可以看到他建議使用twine作為上傳工具。

下個問題是這個twine是什麼呢?有連結[4]就直接按下去吧! [4]說明了twine是官方的上傳工具。那我們就繼續來研究一下怎麼安裝twine。

安裝twine

要安裝python package,會使用到pip,因此你可以藉由 py -m pip --version 確認是不是已經有安裝pip,並且用 py -m pip install --upgrade pip setuptools wheel 來更新pip、setuptools、wheel[5]。以下是我查詢並更新pip版本:


pip版本從19.2.2更新至23.1;setuptools版本從41.2.0更新至67.6.1;wheel版本維持0.40.0。

我們可以直接從PyPI下載twine。在[6] 可以看到支援twine的Python版本,包含3.7, 3.8, 3.9, 3.10版本。在左側的導覽列裡,可以找到下載twine的連結[7]。Source Distribution是用sdist安裝,Built Distribution是用wheel。pip兩者都可以支援,但是會優先使用wheel的版本[5]。

接著在命令提示字元將位置移到下載twine package的資料夾,以我為例是downloads資料夾。然後使用 py -m pip install twine 。可以看到pip選擇wheel建立的版本。

上傳project

安裝好之後,我們回到nester資料夾,準備上傳。首先先用twine檢查要發布的內容有沒有問題。用 py twine check dist/* 來檢查。Pass之後,就用 py twine upload dist/* 上傳 [8]。過程一樣需要你登入PyPI。

可以看到上傳有錯誤,不過這是因為project_name已經存在的關係。畢竟每位看《深入淺出 Python》的讀者都會用同一個project name。這一點書中也有提到,這是可能會發生的錯誤。所以若是你要上傳你自己的project,要注意是不是已經有人使用過這個project name囉!

這個網誌中的熱門文章

pip install module from local file