如果你有多个模块需要发布,而它们又存在于多个包中,那么指定整个包比指定模块可能要容易地多。即使你的模块并不在一个包内,这种做法也行的通;你可以告诉Distutils从根包(root package)处理模块,并且它工作起来和其他任意的包一样(除非你不需要拥有一个__init__.py文件)。

例1.1 根包发布

文件结构为:

<root>/
setup.py
foo.py
bar.py

setup脚本可以这样写:

from distutils.core import setup
setup(name='foobar',
version='1.0',
packages=[''],
)

(空字符串表示根包)

例1.2 根包发布(模块在子目录)

如果你把上例中两个模块文件移入到一个子目录,但是它们仍在根包中,如:

<root>/
setup.py
src/
foo.py
bar.py

那么将仍然指定根包,但是你必须告诉Distutils那些源文件在哪里:

from distutils.core import setup
setup(name='foobar',
version='1.0',
package_dir={'': 'src'},
packages=[''],
)

例2.1 包发布

如果你想发布在同一包中(或者在子包中)的多个模块。比如,如果foobar 模块属于包foobar,文件结构如下:

<root>/
setup.py
foobar/
__init__.py
foo.py
bar.py

实际上这是Distutils默认的层次,一个精简的setup脚本可以这样写:

from distutils.core import setup
setup(name='foobar',
version='1.0',
packages=['foobar'],
)

例2.2 包发布(模块所在目录名不是包名)

如果你想将模块放入不是包名的目录,那么你还需要用到package_dir参数。例如,如果在foobar 包中src 目录拥有多个模块:

<root>/
setup.py
src/
__init__.py
foo.py
bar.py

合适的setup脚本将会是:

from distutils.core import setup
setup(name='foobar',
version='1.0',
package_dir={'foobar': 'src'},
packages=['foobar'],
)

例2.3 包发布(包存在于根目录)

或者你想把包放在发布根目录,如:

<root>/
setup.py
__init__.py
foo.py
bar.py

这种情况下你的setu脚本将会是:

from distutils.core import setup
setup(name='foobar',
version='1.0',
package_dir={'foobar': ''},
packages=['foobar'],
)

(空字符串同样也代表当前目录)

例2.4 包发布(多子包)

如果你有多个子包,它们必须被显在地列举在packages参数中,但是其他任何在package_dir参数中的实体自动扩展到子包。(换句话说,Distutils并不浏览你的源文件树(source tree),而是通过寻找__init__.py文件来计算相应Python包的目录。)因此,如果默认的层次有一个子包:

<root>/
setup.py
foobar/
__init__.py
foo.py
bar.py
subfoo/
__init__.py
blah.py

那么相应的setup脚本将会是:

from distutils.core import setup
setup(name='foobar',
version='1.0',
packages=['foobar', 'foobar.subfoo'],
)

注意:发布一个包,就是将该包所在目录所有模块全部发布。那么我们就不能只发布包内部分模块。

例如,文件结构如下:

<root>/
setup.py
sub_package1/
__init__.py
sub_model1
sub_model2
sub_package2/
__init__.py
sub_model3

使用Distutils,我们无法在发布包sub_packe1sub_package2的同时,不发布sub_model2模块。

纯Python包发布setup脚本编写示例的更多相关文章

  1. 实战教程:如何将自己的Python包发布到PyPI上

    1. PyPi的用途 Python中我们经常会用到第三方的包,默认情况下,用到的第三方工具包基本都是从Pypi.org里面下载. 我们举个栗子: 如果你希望用Python实现一个金融量化分析工具,目前 ...

  2. 将python包发布到PyPI和制作whl文件

    参考链接:wheel和egg的不同怎样将自己写的包传达到PyPi发布你自己的轮子 - PyPI打包上传实践PyPI官网上传包教程 wheel文件Wheel和Egg都是python的打包格式,目的是支持 ...

  3. 老李推荐: 第3章1节《MonkeyRunner源码剖析》脚本编写示例: MonkeyRunner API使用示例

    老李推荐: 第3章1节<MonkeyRunner源码剖析>脚本编写示例: MonkeyRunner API使用示例   MonkeyRunner这个类可以说是编写monkeyrunner脚 ...

  4. 老李推荐:第3章3节《MonkeyRunner源码剖析》脚本编写示例: MonkeyImage API使用示例 1

    老李推荐:第3章3节<MonkeyRunner源码剖析>脚本编写示例: MonkeyImage API使用示例   在上一节的第一个“增加日记”的示例中,我们并没有看到日记是否真的增加成功 ...

  5. 第3章2节《MonkeyRunner源码剖析》脚本编写示例: MonkeyDevice API使用示例(原创)

    天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写<深入理解 MonkeyRunner>书籍“.但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在 ...

  6. 第3章1节《MonkeyRunner源码剖析》脚本编写示例: MonkeyRunner API使用示例(原创)

    天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写<深入理解 MonkeyRunner>书籍“.但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在 ...

  7. python遍历目录文件脚本的示例

    例子 自己写的一个Python遍历文件脚本,对查到的文件进行特定的处理.没啥技术含量,但是也记录一下吧. 代码如下 复制代码 #!/usr/bin/python# -*- coding: utf-8 ...

  8. 第3章3节《MonkeyRunner源码剖析》脚本编写示例: MonkeyImage API使用示例(原创)

    天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写<深入理解 MonkeyRunner>书籍“.但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在 ...

  9. 老李推荐: 第3章2节《MonkeyRunner源码剖析》脚本编写示例: MonkeyDevice API使用示例 4

    第七步:保存新增加日记 代码3-2-7 增加日记-保存日记 #Step7: Save the note by touch on the "save" menu entry by c ...

随机推荐

  1. silverlight 跨域访问 wcf

    先介绍一下我的测试项目,我用flash和silverlight一同来调用一个webservice,一个flash客户端,一个silverlight客户端,一个web项目来host flash和silv ...

  2. 【BZOJ】3673: 可持久化并查集 by zky & 3674: 可持久化并查集加强版(可持久化线段树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3674 http://www.lydsy.com/JudgeOnline/problem.php?id ...

  3. 开学后,板刷usaco!

    我要开权限我要开权限我要开权限我要开权限我要开权限我要开权限我要开权限我要开权限 他们刷rank的太可恶了 没有usaco银组金组分类的oj太可恶了 没有usaco翻译的太可恶了 没有usaco数据的 ...

  4. Java_BigDecimal类型比较大小

    这个类是java里精确计算的类 1 比较对象是否相等 一般的对象用equals,但是BigDecimal比较特殊,举个例子: BigDecimal a=BigDecimal.valueOf(1.0); ...

  5. 关于iOS手势

    引: 前几天遇到一个坑,又仔细分析了一下事件的原理,不得不承认苹果的文档还是写的挺好的,网上就搜不到有几篇博客是介绍这个的,都是一些关于基本的用法的.这里纪录一下. 1.关于事件响应链. a.硬件接收 ...

  6. thinkphp框架中session常识

    在看别人代码时候,发现他,在tp框架中使用session没有些session_start();然后我去查看了手册初始化设置方法 无需手动调用,在App类的初始化工作结束后会自动调用,通常项目只需要配置 ...

  7. 浅谈Java中的Set、List、Map的区别

    http://developer.51cto.com/art/201309/410205_all.htm

  8. ThinkPHP 3.2.2 在 volist 多重循环嵌套中使用 if 判断标签

    今天在 ThinkPHP 3.2.2 的试图模板中使用多重循环,用来把相应类别下对应的文章都依次循环出来,但是无论如何只能循环出类别,类别下的文章无法循环出,( 错误 ) 代码如下: <voli ...

  9. PHP+jQuery 注册模块的改进之三:使用 Smarty3

    Smarty3.1X( 最新版本 3.1.19) 比起Smarty2.x修改了不少特性.我把这个模块使用Smarty3.1.18 ( 下载地址http://www.smarty.net/files/S ...

  10. = splice

    <script> function wf(w){ console.log(w); } var wa = [3,66,7]; var wb = wa; wa.splice(1,1); wf( ...