利用setuptools發佈Python程序到PyPI,爲Python添磚加瓦

pip install的東西從哪裏來的?

從PyPI (Python Package Index)來的,官網是:  https://pypi.python.org/pypi/
執行pip install terminaltranslator命令的時候,它就會去從官方網站搜terminaltranslator,搜到了就下載壓縮包並解壓安裝,若是沒有搜索到就會報錯。python

衆所周知的緣由,國內訪問國外網站老是不那麼順暢,因而就有了PyPI鏡像,國內有不少,我用過阿里雲的,中科大的,豆瓣的。阿里雲的同步的好像不夠及時,中科大的好像很及時,因此我就用中科大的。那麼,該怎麼用這些鏡像呢?git

方法1: 給pip加參數-i 後面跟鏡像的url,可是要記住並每次都寫這個url但是一件難事。
方法2: 編寫配置文件~/.pip/pip.conf:github

[global]
index-url = https://mirrors.ustc.edu.cn/pypi/web/simple

 

如何把你本身的Python程序發佈到PyPI上面去?

首先去官網註冊你的帳號,不能師出無名總得留下你的大名嘛。註冊地址:
https://pypi.python.org/pypi?%3Aaction=register_formweb

註冊好後編寫你的配置文件~/.pypirc工具

[distutils]
index-servers = 
  pypi
  pypitest

[pypi]
repository=https://pypi.python.org/pypi
username=Your-Account
password=Your-Password

[pypitest]
repository=https://testpypi.python.org/pypi
username=Your-Account
password=Your-Password

 

這裏配置了兩個地址,一個是PyPI Live,是正式發佈Python包的;另外一個是PytPI Test 是用來正式發佈以前驗證你的包是否正常。學習

準備好你的Python包

一般你的代碼目錄結構以下:網站

root-dir/   # 你的代碼的根目錄
  setup.py
  setup.cfg
  LICENSE.txt
  README.md
  mypackage/
    __init__.py
    foo.py
    bar.py
    baz.py

 

其中的setup.py就是安裝包的文件,格式以下:阿里雲

from distutils.core import setup
setup(
  name = 'mypackage',
  packages = ['mypackage'], # 跟上面代碼目錄下面的包名一致
  version = '0.1',
  description = 'A setup test package',
  author = 'veelion',
  author_email = 'veelion@gmail.com',
  url = 'https://github.com/veelion/mypackage', # 指向 github 倉庫的URL
  keywords = ['testing', 'logging', 'example'], # 一些關鍵詞
  classifiers = [],
)

 

setup能夠從兩個包裏面調來使用,一個是上面用的distutils,另一個是setuptools,如:url

from setuptools import setup

 

這兩個包功能基本同樣,而setuptools支持wheel(將來包管理的趨勢),因此通常用setuptools更好一些。再多說兩句wheel,它是用來準備替換老的egg的,其中很好的一個優勢是「二進制格式發佈」,當包內含有C/C++寫的擴展的時候能夠把.so/.dll等二進制庫打包進去,實現「一次編譯,處處使用」的目標。省的用戶編譯時須要解決一堆依賴問題。spa

可是setuptools好像是不支持單文件包,即你的包只是一個.py文件而非上面說的是一個帶__init__.py我目錄。而distutils經過py_modules能夠指定當個文件做爲包。

上面說的是用setup.py管理Python包讓其餘人import用,而非在命令行下指向。

而terminaltranslator 是一個命令行工具,能夠在setup.py裏面不指定package而是指定scripts來把相關文件安裝到bin目錄下:

if __name__ == "__main__":
    from setuptools import setup

    setup(
        name='TerminalTranslator',
        version='0.8',
        author="Veelion chong",
        author_email="veelion@gmail.com",
        license='MIT',
        url='https://github.com/veelion/tt',
        description=("Linux terminal translating tool implemented in Python"),
        scripts=['t', 'tt', 'terminaltranslator.py'],
    )

 

這裏還用到一個小tip,把terminaltranslator.py 連接爲t和tt兩個別名,這樣命令行下使用起來更方便。 不過,好像Windows下不支持Linux的軟連接,t和tt可能在Windows下出問題

發佈到PyPI

首先,打包生成壓縮包

python setup.py sdist
python setup.py bdist_wheel (distutils不支持這個wheel選項)

 

上傳到PyPI:

python setup.py register #註冊你的包,若是出現與已有包重名則報錯 python setup.py upload

 

更新:在python3下面,python setup.py upload 已經無效,官方推薦用 twine 上傳到pypi。

或者能夠用twine (無需register,直接upload)

twine register dist/xxx.gz twine register dist/xxx.whl
twine upload dist/*

 

 

python學習筆記整理於猿人學網站的python基礎教程

相關文章
相關標籤/搜索