为啥要提交到pypi?因为提交成功后,你今后想用你自己写的模块,只要pip install一下就可以了。
那么如何提交?请参看本篇教程
首先要确定你的包叫啥名,比如我的包叫xlutils3,既然确定了,那么就创建该名称的文件夹,然后把源码放到文件夹中,然后检查文件夹内部的文件里的每个导入库是否写对路径,比如xlutils.copy就得改成xlutils3.copy
然后就是在文件夹下创建一个__init__.py
文件,内容可以全部为空,整理成包的文件结构大概像下面这样:
xlutils3/ | +-- __init__.py | +-- myscripts1.py | +-- mysscripts2.py | +-- mymorescripts.py |
xlutils3就是包的名称,下面my***.py
的各种文件就是原有的各种代码模块。
这个包如果不上传到pypi,纯粹本地用已经完全没问题。
所以你要检查内部一些方法函数的话可以import然后调用方法检查一下
如果要打包到PyPI上,那么就需要在上面的基础上,在加点料。首先,需要调整下文件的目录结构,把上面的改成下面这个样子:
xlutils3/ | +-- xlutils3/ . | . +-- __init__.py . | . +-- myscripts1.py . | . +-- mysscripts2.py . | . +-- mymorescripts.py . | |
就是把原先的xlutils3文件夹放到另一个xlutils3文件夹下,然后在最上层的文件夹中创建一些文件:
xlutils3 | +-- COPYING.txt | +-- README.txt | +-- setup.py | +-- xlutils3 . | . +-- __init__.py . | . +-- myscripts1.py . | . +-- mysscripts2.py . | . +-- mymorescripts.py . | +-- docs/ |
除了docs这个目录,其他文件一个都不可以少。
README.rst
这类文件代替setup.py示例文件如下,不多说了,提交前请把中文注释删除
import codecs import os import sys try: from setuptools import setup except: from distutils.core import setup """ 打包的用的setup必须引入, """ def read(fname): """ 定义一个read方法,用来读取目录下的长描述 我们一般是将README文件中的内容读取出来作为长描述,这个会在PyPI中你这个包的页面上展现出来, 你也可以不用这个方法,自己手动写内容即可, PyPI上支持.rst格式的文件。暂不支持.md格式的文件,<BR>.rst文件PyPI会自动把它转为HTML形式显示在你包的信息页面上。 """ return codecs.open(os.path.join(os.path.dirname(__file__), fname)).read() NAME = "somefunctions" """ 名字,一般放你包的名字即可 """ PACKAGES = ["somefunctions",] """ 包含的包,可以多个,这是一个列表 """ DESCRIPTION = "this is a test package for packing python liberaries tutorial." """ 关于这个包的描述 """ LONG_DESCRIPTION = read("README.rst") """ 参见read方法说明 """ KEYWORDS = "test python package" """ 关于当前包的一些关键字,方便PyPI进行分类。 """ AUTHOR = "MitchellChu" """ 谁是这个包的作者,写谁的名字吧 我是MitchellChu,自然这里写的是MitchellChu """ AUTHOR_EMAIL = "[email protected]" """ 作者的邮件地址 """ URL = "http://blog.useasp.net/" """ 你这个包的项目地址,如果有,给一个吧,没有你直接填写在PyPI你这个包的地址也是可以的 """ VERSION = "1.0.1" """ 当前包的版本,这个按你自己需要的版本控制方式来 """ LICENSE = "MIT" """ 授权方式,我喜欢的是MIT的方式,你可以换成其他方式 """ setup( name = NAME, version = VERSION, description = DESCRIPTION, long_description = LONG_DESCRIPTION, classifiers = [ 'License :: OSI Approved :: MIT License', 'Programming Language :: Python', 'Intended Audience :: Developers', 'Operating System :: OS Independent', ], keywords = KEYWORDS, author = AUTHOR, author_email = AUTHOR_EMAIL, url = URL, license = LICENSE, packages = PACKAGES, include_package_data=True, zip_safe=True, ) ## 把上面的变量填入了一个setup()中即可。
值得注意的是classifiers 不可以乱写,否则会导致上传失败
一般情况下,Distutils只会包含你包文件夹内的:README.txt
,setup.py
,packages
里面定义的所有某块的.py文件,py_modules
参数包含的所有.py文件,其他文件需要被包含进来,需要单独添加。需要添加,你可以在根目录添加一个MANIFEST.in
文件,将要包含的文件放入,具体规则请参考官方文档格式。如我们这里需要添加COPYING.txt
可以在MANIFEST.in
中添加如下行:include COPYING.txt
写完之后为了检查,可以在命令行里cd到文件的setup.py所在的目录输入python setup.py check
一般有异常的话都是你setup.py文件没写对
没有异常输出的话就可以打包:python setup.py sdist
打包后可以上传,但建议先把包拿到其他未装过包的地方安装运行一遍
没问题的话可以直接进行:去pypi注册一个账号,然后命令行里输入python setup.py register sdist upload
running register We need to know who you are, so please choose either: 1. use your existing login, 2. register as a new user, 3. have the server generate a new password for you (and email it to you), or 4. quit Your selection [default 1]: 1
一般都会报错,所以我建议在setup.py的同目录下放上账号文件,账号文件名为.pypirc,内容如下:
[pypi] repository = https://pypi.python.org/pypi [server-login] username:slqt password:【你的密码】
记得windows下写的文档,开头会有讨厌的BOM!解决办法有两种:
1、用editplus的十六进制编辑器删掉BOM
2、在linux里建立好文件后拖到windows下,然后换行处理
然后重新执行python setup.py sdist以及后续的操作,上传ok后可以去页面看一下,然后卸载本地的,然后pip install测试下
以下就是我发布的包的地址https://pypi.python.org/pypi/xlutils3