利用setuptools发布Python程序到PyPI为Python添砖加瓦

28次阅读

共计 2518 个字符,预计需要花费 7 分钟才能阅读完成。

pip install 的东西从哪里来的?

从 PyPI(Python Package Index)来的,官网是:https://pypi.python.org/pypi/
执行 pip install terminaltranslator 命令的时候,它就会去从官方网站搜 terminaltranslator,搜到了就下载压缩包并解压安装,如果没有搜索到就会报错。

众所周知的原因,国内访问国外网站总是不那么顺畅,于是就有了 PyPI 镜像,国内有很多,我用过阿里云的,中科大的,豆瓣的。阿里云的同步的好像不够及时,中科大的好像很及时,所以我就用中科大的。那么,该怎么用这些镜像呢?

方法 1:给 pip 加参数 -i 后面跟镜像的 url,但是要记住并每次都写这个 url 可是一件难事。
方法 2:编写配置文件~/.pip/pip.conf:

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

如何把你自己的 Python 程序发布到 PyPI 上面去?

首先去官网注册你的账号,不能师出无名总得留下你的大名嘛。注册地址:
https://pypi.python.org/pypi?…

注册好后编写你的配置文件~/.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,如:

from setuptools import setup

这两个包功能基本一样,而 setuptools 支持 wheel(未来包管理的趋势),所以一般用 setuptools 更好一些。再多说两句 wheel,它是用来准备替换老的 egg 的,其中很好的一个优点是“二进制格式发布”,当包内含有 C /C++ 写的扩展的时候可以把.so/.dll 等二进制库打包进去,实现“一次编译,到处使用”的目标。省的用户编译时需要解决一堆依赖问题。

但是 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 教程。

版权申明: 若没有特殊说明,文章皆是猿人学原创,没有猿人学授权,请勿以任何形式转载。

正文完
 0