在D盘pydemo目录下创建一个nester目录(此目录为举例说明,属自定义)
在目录中添加两个python程序文件:nester.py和setup.py
nester.py 模块的程序文件,代码如下(实现递归遍历数组):
def print_lol(arr):
for row in arr:
if(isinstance(row , list)):
print_lol(row)
else:
print row
setup.py 保存模块的安装信息,包含模块名称,模块开发者等信息,代码如下:
from distutils.core import setup
setup (
name = 'nester',
version = '1.0.1',
py_modules = ['nester'],
author = 'ken.wong',
author_email = '[email protected]',
description = 'Module demo',
)
注意:
name和py_modules这两个参数一定要与nester.py文件名相同,否则发布安装时会发出模块文件找不到的错误
通过命令行,进入nester目录(D:/pydemo/nester),依次输入下图中红色框的命令
发布模块,但还不能在程序中被调用,还需要安装,接着看
See,安装完成,在python环境下产生一个nester-1.0.1-py2.7.egg-info文件,有点类似php扩展的.dll(windows环境下的)
现在可以在程序中使用刚才安装的nester模块
import nester
movies = ['a','b',['c1','c2']]
nester.print_lol(movies)
这里需要注意一个问题,很多新手会这样调用:
print_lol(movies)
系统会发出这样的一个错误信息:NameError: name 'print_lol' is not defined
原因是当模块创建以后,系统自动创建一个与模块名称相同的命名空间(nester),并将函数放在命名空间中,简单的通过print_lol调用,自然无法找到函数,正确的方法:
nester.print_lol(movies)
直接把命名空间带上即可。
php开发中,我们定义好了一个公用函数,则会将代码放在公用的文件中,需要用到的时候,使用require或者include函数包含这个公用的文件,即可在程序中实现可重用。接下来看看python中如何操作系统环境:window xp sp3,python2.7
在D盘pydemo目录下创建一个nester目录(此目录为举例说明,属自定义)
在目录中添加两个python程序文件:nester.py和setup.py
nester.py 模块的程序文件,代码如下(实现递归遍历数组):
def print_lol(arr):
for row in arr:
if(isinstance(row , list)):
print_lol(row)
else:
print row
setup.py 保存模块的安装信息,包含模块名称,模块开发者等信息,代码如下:
from distutils.core import setup
setup (
name = 'nester',
version = '1.0.1',
py_modules = ['nester'],
author = 'ken.wong',
author_email = '[email protected]',
description = 'Module demo',
)
注意:
name和py_modules这两个参数一定要与nester.py文件名相同,否则发布安装时会发出模块文件找不到的错误
通过命令行,进入nester目录(D:/pydemo/nester),依次输入下图中红色框的命令
发布模块,但还不能在程序中被调用,还需要安装,接着看
See,安装完成,在python环境下产生一个nester-1.0.1-py2.7.egg-info文件,有点类似php扩展的.dll(windows环境下的)
现在可以在程序中使用刚才安装的nester模块
import nester
movies = ['a','b',['c1','c2']]
nester.print_lol(movies)
这里需要注意一个问题,很多新手会这样调用:
print_lol(movies)
系统会发出这样的一个错误信息:NameError: name 'print_lol' is not defined
原因是当模块创建以后,系统自动创建一个与模块名称相同的命名空间(nester),并将函数放在命名空间中,简单的通过print_lol调用,自然无法找到函数,正确的方法:
nester.print_lol(movies)
直接把命名空间带上即可。
什么是pypi
简单的说pypi是一个python包的仓库,里面有很多别人写好的python库,你可以通过easy_install或者pip进行安装,方便用户更方面的使用你的代码模块。
将代码打包并上传到pypi上,大体上分为以下几步:
1、整理代码的目录结构,方便打包和python的import,为了方便引用,需要将代码模块变成一个包,所以需要将功能代码用目录来整合方便引用,并且需要创建__init__文件,__init__中可以没有内容,也可以在__init__文件中进行import(from .extractor import Document)操作,以减少整体模块引用时import的层数,避免错误。
[html] view plain copy├── ./tidypage
│ ├── ./tidypage/cleaners.py
│ ├── ./tidypage/extractor.py
│ ├── ./tidypage/__init__.py
│ └── ./tidypage/titles.py
2、功能模块的目录整理好后,就可以开始整理和添加发布到pypi上所使用的文件了
tidy_page├── LICENSE
├── README.rst
├── requirements.txt
├── setup.py
├──tidypage
│ ├──cleaners.py
│ ├──extractor.py
│ ├──__init__.py
│ └──titles.py
就是将原来的目录深移一层,文件夹名称可以根据自己意愿。然后在到第一层的目录下创建些特殊文件,具体你可以看看下面这个文件结构你就明白了
LICENSE文件是授权文件,比如:MIT license, APACHE license
README.rst 文件想必大家都不陌生,其实就是项目介绍和使用说明
setup文件才是重点,是python模块安装所需要的文件,它的格式如下:
#!/usr/bin/env pythonfrom __future__ import print_function
from setuptools import setup, find_packages
import sys
setup(
name="tidy-page",
version="0.1.1",
author="Desion Wang",
author_email="[email protected]",
description="html text parser,get the content form html page",
long_description=open("README.rst").read(),
license="MIT",
url="https://github.com/desion/tidy_page",
packages=['tidypage'],
install_requires=[
"beautifulsoup4",
lxml_requirement
],
classifiers=[
"Environment :: Web Environment",
"Intended Audience :: Developers",
"Operating System :: OS Independent",
"Topic :: Text Processing :: Indexing",
"Topic :: Utilities",
"Topic :: Internet",
"Topic :: Software Development :: Libraries :: Python Modules",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 2.6",
"Programming Language :: Python :: 2.7",
],
) NAME 名字,一般放你包的名字即可PACKAGES 包含的包,可以多个,这是一个列表DESCRIPTION 关于这个包的描述LONG_DESCRIPTION 参见read方法说明KEYWORDS 关于当前包的一些关键字,方便PyPI进行分类。AUTHOR 谁是这个包的作者,写谁的名字吧AUTHOR_EMAIL 作者的邮件地址URL 你这个包的项目地址,如果有,给一个吧,没有你直接填写在PyPI你这个包的地址也是可以的VERSION 当前包的版本,这个按你自己需要的版本控制方式来LICENSE 授权方式INSTALL_REQUIRES 模块所依赖的python模块
文中的classifiers的内容并不是随便填写的,你需要参照本文参考文档中的PyPI Classifiers来写
3、开始使用Distutils进行打包
为了保证效果,在打包之前我们可以验证setup.py的正确性,执行下面的代码
python setup.py check
输出一般是running check如果有错误或者警告,就会在此之后显示没有任何显示表示Distutils认可你这个setup.py文件。
如果没有问题,那么就可以正式打包,执行下面的代码:
python setup.py sdist
执行完成后,会在顶层目录下生成dist目录和egg目录
tidy_page├── tidy_page/dist
│ ├── tidy_page/dist/tidy-page-0.1.0.tar.gz
│ └── tidy_page/dist/tidy-page-0.1.1.tar.gz
├── tidy_page/LICENSE
├── tidy_page/README.rst
├── tidy_page/setup.py
├── tidy_page/tidypage
│ ├── tidy_page/tidypage/cleaners.py
│ ├── tidy_page/tidypage/extractor.py
│ ├── tidy_page/tidypage/__init__.py
│ └── tidy_page/tidypage/titles.py
├── tidy_page/tidy_page.egg-info
│ ├── tidy_page/tidy_page.egg-info/dependency_links.txt
│ ├── tidy_page/tidy_page.egg-info/PKG-INFO
│ ├── tidy_page/tidy_page.egg-info/requires.txt
│ ├── tidy_page/tidy_page.egg-info/SOURCES.txt
│ └── tidy_page/tidy_page.egg-info/top_level.txt
4、打包完成后就可以准备将打包好的模块上传到pypi了,首先你需要在pypi上进行注册 goto PyPI Live
注册完成后,你需要在本地创建好pypi的配置文件,不然有可能会出现使用http无法上传到pypi的问题
Create a .pypirc configuration file,在用户的home目录下创建.pypirc文件,文件的内容如下
[distutils]index-servers = pypi[pypi]repository=https://pypi.python.org/pypiusername=your_usernamepassword=your_passwor chmod 600 ~/.pypircpython setup.py register -r pypi
在pypi上注册模块
python setup.py sdist upload -r pypi
上传python文件包,没有问题你就可以在pypi上看到你上传的包了并且可以使用pip搜索和install你的python包了