python自己写包_python自定义模块/包

1、module和package

1.1 模块module

module就是一个.py文件

xxx.py可以直接被import

同级目录可以import xxx

也可用sys.path.append()临时添加路径,来import其他目录下的xxx.py

1.2 包packages

packages就是一个文件夹(一般要有__init__.py,root包可以不要),其中包括多个module

以包的形式import

-aaa

|-__init__.py

|-foo.py

在aaa的同级文件夹下,即可import aaa,__init__.py定义的函数fun即可通过aaa.fun()访问,

也可import aaa.foo,foo.py中定义的函数fun可以通过aaa.foo.fun()访问

1.3 root包

不含__init__.py的package

2、自定义模块、包的使用

setup.py

from distutils.core import setup

setup(name='nnn',

version='1.0',

py_modules=['foo'],

)

python setup.py sdist生成一个.gz文件,可在别处解压安装

python setup.py install安装,将gz中的文件copy到site-package目录中

示例:

2.1

-aaa/

|-setup.py

|-foo/

|-__init__.py

|-fff.py

setup.py

from distutils.core import setup

setup(name='nnn',

version='1.0',

packages = ['foo']

)

python setup.py sdist即可生成一个.gz文件

python setup.py install将文件copy到site-package目录中,文件结构为

|-foo/

|-__init__.py

|-fff.py

import foo后在foo/__init__.py定义的函数fun即可通过foo.fun()访问,但不可访问foo/fff.py中定义的函数

import foo.fff后foo/fff.py中的函数fun可通过foo.fff.fun()访问,foo/__init__.py定义的函数fun可以通过foo.fun()访问(默认import了fff的上级foo)

from foo import fff后foo/fff.py中的函数fun可通过fff.fun()访问,foo/__init__.py定义的函数不可访问

from foo import *后foo/__init__.py中的函数fun可通过fun()访问,不能用foo.fun(),fff的都不能访问

from foo.fff import *后foo/fff.py中的函数fun可通过fun()访问,不能用fff.fun(),foo的都不能访问

总结:

import foo.fff能用foo.fff和foo

from foo import fff 只能用fff

2.2

-aaa/

|-setup.py

|-foo/

|-__init__.py

|-fff/

|-__init__.py

from distutils.core import setup

setup(name='nnn',

version='1.0',

packages=['foo', 'foo.fff'],

)

install后在site-package下生成

|-foo/

|-__init__.py

|-fff/

|-__init__.py

2.3

-aaa/

|-setup.py

|-fff.py

|-ggg.py

|-foo/

|-__init__.py

from distutils.core import setup

setup(name='nnn',

version='1.0',

packages=[''],

)

install后在site-package下生成

|-fff.py

|-ggg.py

只安装了fff,ggg,没有安装foo

这就是root包,当前目录没有__init__.py,只将当前目录下的xx.py作为模块安装,包不会被安装

2.4

-aaa/

|-setup.py

|-src/

|-fff.py

|-ggg.py

from distutils.core import setup

setup(name='nnn',

version='1.0',

package_dir={'': 'src'},

packages=[''],

)

效果同上

package_dir={'a': 'b'} 这是一个dictionary,b是实际目录,a是一个安装后使用的名字用来替代b,当a为空时,就是root包

2.5

-aaa/

|-setup.py

|-fff.py

|-foo/

|-__init__.py

|-ggg.py

from distutils.core import setup

setup(name='nnn',

version='1.0',

packages=['foo'],

)

install后在site-package下生成

|-foo/

|-__init__.py

|-ggg.py

2.6

-aaa/

|-setup.py

|-fff.py

|-src/

|-__init__.py

|-ggg.py

from distutils.core import setup

setup(name='nnn',

version='1.0',

package_dir={'foo': 'src'},

packages=['foo'],

)

效果同上

2.7

-aaa/

|-setup.py

|-__init__.py

|-fff.py

|-ggg.py

from distutils.core import setup

setup(name='nnn',

version='1.0',

package_dir={'foo': ''},

packages=['foo'],

)

效果同上

2.8

-aaa/

|-setup.py

|-fff.py

|-src/

|-__init__.py

|-ggg.py

|-subsrc/

|-__init__.py

|-hhh.py

from distutils.core import setup

setup(name='nnn',

version='1.0',

package_dir={'foo': 'src'},

packages=['foo', 'foo.subsrc'],

)

install后在site-package下生成

|-foo/

|-__init__.py

|-ggg.py

|-subsrc/

|-__init__.py

|-hhh.py

2.9

-aaa/

|-setup.py

|-fff.py

|-src1/

|-__init__.py

|-ggg.py

|-src2/

|-__init__.py

|-hhh.py

from distutils.core import setup

setup(name='nnn',

version='1.0',

package_dir={'foo1': 'src1', 'foo2': 'src2'},

packages=['foo1', 'foo2'],

)

install后在site-package下生成

|-foo1/

|-__init__.py

|-ggg.py

|-foo2/

|-__init__.py

|-hhh.py

阅读(1303) | 评论(0) | 转发(0) |

你可能感兴趣的:(python自己写包)