前言
突然想玩玩python了^_^
這篇博文記錄了我打算發布包到pypi的踩坑經歷.python更新太快了,甚至連這種發布上傳機制都在不斷的更新,這導致網上的一些關於python發布上傳到pypi的教程都過時了,按着博文操作會失敗,所以請記住,我這篇博文的介紹也許在你看到時也過時了^_^
pypi相關概念介紹
關於pypi本身
pypi是專門用於存放第三方python包的地方,你可以在這里找別人分享的模塊,也可以自己分享模塊給別人。可以通過easy_install或者pip進行安裝。pypi針對分享提供了兩個平台,一個是測試發布平台,一個是正式發布平台,我們正式發布前可以先用測試發布平台發布,看是否正確,然后再采用正式發布平台.
關於python打包發布工具
python的打包安裝工具也經歷了很多次變化,由最早的distutils到setuptools到distribute又回到setuptools,后來還有disutils2以及distlib等,其中distutils是python標准庫的一部分,它提出了采用setup.py機制安裝和打包發布上傳機制.setuptools(操作系統發布版本可能沒有自帶安裝,需要自己額外安裝)基於它擴展了很多功能,也是采用setup.py機制,針對安裝額外提供了easy_install命令.distribute是setuptools的一個分之,后來又合並到setuptools了,所以姑且就把它看做是最新的setuptools吧!和我們打包最相關的貌似就是distutils或者setuptools,兩者都可以用來打包發布並上傳到pypi,后面介紹采用distutils,如果想更多的功能,比如想通過entry points擴展的一些功能,那么就要使用setuptools了.另外,還有一個工具可以用來發布到pypi,叫twine,需要額外安裝.最后,需要確保自己的工具都是盡量新的,官方給出的版本參考:twine v1.8.0+ (recommended tool), setuptools 27+, or the distutils included with Python 3.4.6+,Python 3.5.3+, Python 3.6+, and 2.7.13+,升級的參考命令sudo -H pip install -U pip setuptools twine
打包發布到pypi
基本流程:
[distutils]
index-servers =
pypi
pypitest
[pypi]
repository: https://upload.pypi.org/legacy/
username: your_username
password: your_password
[pypitest]
repository: https://test.pypi.org/legacy/
username: your_username
password: your_password
該配置文件可以保存到~/.pypirc中,以后基本就不需要修改了。注意,這一步的配置文件編寫由於pypi的發布機制更新導致有一些坑的出現,后面會講述
- 配置工程,這一步會因為工程的復雜度而有較大不同,主要是工程配置文件setup.py,這里用個簡單的工程進行講述.創建工程文件夾,並創建helloxxxxx.py模塊(里面的內容隨意,創建一個打印hello的函數也行)以及setup.py文件,setup.py參考如下配置文件創建即可
from distutils.core import setup
setup(
name = "helloxxxxx",
author = "name",
version = "1.0.0",
author_email = "xxx@gmail.com",
py_modules = ['helloxxxxx'],
url = "http://www.xxx.com"
)
注意,這里只是最基本的參考例子,執行打包會報警告,說缺少一些需要的文件,比如MANIFEST.in、readme.txt等等,暫時忽略即可。正式的項目中會復雜很多,甚至需要用到setuptools來擴展。這部分可以參考其他文檔
-
為了保證效果,在打包之前我們可以驗證setup.py的正確性。執行代碼
python3 setup.py check
,輸出一般是running check,如果有錯誤或者警告,就會在此之后顯示.沒有任何顯示表示Distutils認可你這個setup.py文件 -
執行
python3 setup.py sdist upload -r pypi
創建發布並上傳,如果想先上傳到測試平台,可以執行python setup.py sdist upload -r pypitest,成功后再執行上面命令上傳到正式平台。注意,這一步的配置文件里面由於pypi的發布機制更新導致有一些坑的出現,后面會講述
踩坑記錄
之所以有這些坑, 是因為python更新太快以及自己沒有認真看最新官方文檔導致的!
坑1
410錯誤,這個是pypi上傳機制變更導致的,我雖然參考的是最新的blog,但是還是過時了!!!
首先,.pypirc的repository過時了,很多博客說的repository: https://pypi.python.org/pypi
會導致后面步驟操作出現410錯誤
其次,很多博客說的兩步走方案
python3 setup.py register -r pypi
python3 setup.py sdist upload -r pypi
也過時了,現在不需要第一步了
坑2
400錯誤,setup.py配置文件里面某些字段我寫的太隨意,導致上傳的時候出錯,比如url那里我沒有加http://
,這里也需要大家注意
坑3
403錯誤,這是因為項目和已有的項目重名了,可以先到https://pypi.python.org/simple/
上搜一下看看是否重名。解決的方法自然就是修改一下setup.py中setup函數中的name參數,刪除之前生成的dist文件夾並重新生成,然后再upload
參考
完!
2017年8月