共享Python模块

Python

Posted by sunlianglong on January 22, 2018

PyPI

  Python包索引(Python Package Index, PyPI)为Internet上的第三方Python模块提供了一个集中的存储库,我们平时pip install的Python库都来自这个存储库,我们也可以将自己写好的模块上传到PyPI上面开源,让世界上所有的人都能看到你的python模块。

  为了测试,我写了一个能完成经纬度转换为地理位置的小小demo(用的geopy库),代码如下:

    from geopy.geocoders import Nominatim
    """author :longlong
       purpose :practice
       the function of the module:input latitude,and then convert latitude to location """
    def print_position(lat,lng):
        geolocator = Nominatim()
        location = geolocator.reverse(str(lat)+','+str(lng),timeout=None)
        print(location.address)

  print_position函数有两个参数,分别是纬度和经度,功能是打印出所对应的地理信息。

准备发布

  为了共享创建的这个模块,需要准备一个发布(distribution)的环境。python中,所谓的distribution是指一个文件集合,这些文件联合在一起允许你构建、打包和发布你的模块。

  1. 新建一个文件夹,命名为lat_to_pos

  2. 在lat_to_pos中创建一个setup.py文件,代码是你的个人信息以及模块信息,以上述代码为基准的setup.py代码如下:

from distutils.core import setup
setup(
    name = 'lat_to_pos',
    version = '1.0.0',
    py_modules = ['lat_to_pos'],
    author = 'longlong',
    author_email = '1294054316@qq.com',
    url = 'http://www.sunlainglong.cn',
    description = 'convert latitude to location',
    )

构建发布

 1. 在lat_to_pos文件夹中打开一个终端窗口,键入命令:python setup.py sdist

 2. 安装到本地的Python副本中,执行命令:python setup.py install

  这时,lat_to_pos模块已经转换成了一个发布,并且安装在本地Python副本中。构建完成时,lat_to_pos文件夹的结构如下:

  • lat_to_pos
    • bulid  -  lib    -  lat_to_pos.py
    • dist   -  lat__to_pos-1.0.0.tar.gz 发布包
    • MANIFEST 包含发布中的文件列表
    • lat_to_pos.py python模块
    • setup.py 元数据

  并且,现在就可以本地导入模块使用了,代码如下:

  注意:import lat_to_pos之后 print_position(23,112)会报错,原因是需要加入命名空间: lat_to_pos.print_position(23,112)   主Python程序中(以及IDLE shell)的代码与一个名为__main__的命名空间关联,将代码放在其单独的模块中时,Python会自动创建一个与模块同名的命名空间。所以,我的模块中的代码会与一个名为lat_to_pos的命名空间关联。当然那,也可以通过from lat_to_pos import print_position来导入模块,但是这个特定的impot语句导入的函数会覆盖你自己定义的同名函数。

向PyPI上传代码

  1. 注册PyPI账号

  2. 执行python setup.py register

   根据个人情况选择123来验证身份,保存账号密码以备之后使用。

  3. 执行python setup.py sdist upload

  4. succeed