作为开发者我们希望自己开发的Python模块可以被更多人使用,为了方便使用,PyPI是管理Python模块最好用的工具之一。所以我们也希望把自己的代码放到PyPI上,以后就可以通过pip install module的方式安装模块了。

生成一个本地的 Python 包

  • 在本地python目录中新建setup.py文件。
  • 将源码放置在一个新建的目录中,目录名为模块名。
  • setup.py中写入包的配置信息。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    from setuptools import setup, find_packages
    
    setup(
    name = "sft",
    version = "0.1",
    url = 'https://github.com/xumi1993/SFT',
    author = 'Mijian Xu',
    author_email = '[email protected]',
    packages = find_packages(), 
    package_dir = {'sft':'sft'},
    entry_points = {'console_scripts':[
            'get_events = sft.get_events:main',
            'get_resp = sft.get_resp:main',
            'get_stations = sft.get_stations:main',
            'get_synthetics = sft.get_synthetics:main',
            'get_timeseries = sft.get_timeseries:main',
            'get_traveltime = sft.get_traveltime:main'
            ], # 将模块中的函数当作shell命令
            },
    include_package_data=True,
    zip_safe=False
    )
  • 完成后其目录结构
    SFT —— sft —— get_events.py
                           | — get_resp.py
                           | — ……
                | — setup.py
                | — ……

  • 由于这个例子只依赖Python标准库,所以如果需要依赖其他第三方模块需要在setup.py中加一个字段:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    
    install_requires=[
        'Twisted>=13.1.0',
        'w3lib>=1.17.0',
        'queuelib',
        'lxml',
        'pyOpenSSL',
        'cssselect>=0.9',
        'six>=1.5.2',
        'parsel>=1.1',
        'PyDispatcher>=2.0.5',
        'service_identity',
    ]

编译Python包

使用下面命令打包一个源代码的包

1
python setup.py sdist build

这样在当前目录的dist文件夹下,就会多出一个以tar.gz结尾的包了。

注册PyPI

打开PyPI官网点击Register注册一个账户,记住用户名和密码后面要用。

发布至PyPI

官方推荐的方式是用twine模块(我在试用python setup.py sdist upload时没有成功):

  • 安装twine

    1
    
    sudo pip install twine
  • 上传包

    1
    
    twine upload dist/*

命令行中会提示输入用户名密码,输入PyPI的用户名密码就发布成功了。