Weibw's World Weibw's World
首页
  • HTML
  • Python

    • Python基础知识
    • Python CookBook第三版
    • Flask
  • MySQL

    • MySQL基础知识
    • MySQL调优
    • MySQL面试题
算法
  • FineReport
  • Kettle
  • Git
  • 微信公众号文章
  • 优秀博客文章
  • 其他
收藏夹
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Weibw

一个没有梦想的咸鱼
首页
  • HTML
  • Python

    • Python基础知识
    • Python CookBook第三版
    • Flask
  • MySQL

    • MySQL基础知识
    • MySQL调优
    • MySQL面试题
算法
  • FineReport
  • Kettle
  • Git
  • 微信公众号文章
  • 优秀博客文章
  • 其他
收藏夹
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 《Flask》

  • 《Python Cookbook》第三版

    • 第一章:数据结构与算法

    • 第二章:字符串和文本

    • 第三章:数字日期和时间

    • 第四章:迭代器与生成器

    • 第五章:文件与IO

    • 第六章:数据编码和处理

    • 第七章:函数

    • 第八章:类与对象

    • 第九章:元编程

    • 第十章:模块与包

      • 构建一个模块的层级包
      • 控制模块被全部导入的内容
      • 使用相对路径名导入包中子模块
      • 将模块分割成多个文件
      • 利用命名空间导入目录分散的代码
      • 重新加载模块
      • 运行目录或压缩文件
      • 读取位于包中的数据文件
      • 将文件夹加入到syspath
      • 通过字符串名导入模块
      • 通过钩子远程加载模块
      • 导入模块的同时修改模块
      • 安装私有的包
      • 创建新的Python环境
      • 分发包
        • 问题
        • 解决方案
        • 讨论
    • 第十一章:网络与Web编程

    • 第十二章:并发编程

    • 第十三章:脚本编程与系统管理

    • 第十四章:测试、调试和异常

    • 第十五章:C语言扩展

  • Python基础

  • Python
  • 《Python Cookbook》第三版
  • 第十章:模块与包
weibw
2022-01-18

分发包

# 问题

你已经编写了一个有用的库,想将它分享给其他人。

# 解决方案

如果你想分发你的代码,第一件事就是给它一个唯一的名字,并且清理它的目录结构。 例如,一个典型的函数库包会类似下面这样:

projectname/
    README.txt
    Doc/
        documentation.txt
    projectname/
        __init__.py
        foo.py
        bar.py
        utils/
            __init__.py
            spam.py
            grok.py
    examples/
        helloworld.py
        ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

要让你的包可以发布出去,首先你要编写一个 setup.py ,类似下面这样:

# setup.py
from distutils.core import setup

setup(name='projectname',
    version='1.0',
    author='Your Name',
    author_email='you@youraddress.com',
    url='http://www.you.com/projectname',
    packages=['projectname', 'projectname.utils'],
)
1
2
3
4
5
6
7
8
9
10

下一步,就是创建一个 MANIFEST.in 文件,列出所有在你的包中需要包含进来的非源码文件:

# MANIFEST.in
include *.txt
recursive-include examples *
recursive-include Doc *
1
2
3
4

确保 setup.py 和 MANIFEST.in 文件放在你的包的最顶级目录中。 一旦你已经做了这些,你就可以像下面这样执行命令来创建一个源码分发包了:

% bash python3 setup.py sdist
1

它会创建一个文件比如”projectname-1.0.zip” 或 “projectname-1.0.tar.gz”, 具体依赖于你的系统平台。如果一切正常, 这个文件就可以发送给别人使用或者上传至 Python Package Index (opens new window).

# 讨论

对于纯Python代码,编写一个普通的 setup.py 文件通常很简单。 一个可能的问题是你必须手动列出所有构成包源码的子目录。 一个常见错误就是仅仅只列出一个包的最顶级目录,忘记了包含包的子组件。 这也是为什么在 setup.py 中对于包的说明包含了列表 packages=['projectname', 'projectname.utils']

大部分Python程序员都知道,有很多第三方包管理器供选择,包括setuptools、distribute等等。 有些是为了替代标准库中的distutils。注意如果你依赖这些包, 用户可能不能安装你的软件,除非他们已经事先安装过所需要的包管理器。 正因如此,你更应该时刻记住越简单越好的道理。 最好让你的代码使用标准的Python 3安装。 如果其他包也需要的话,可以通过一个可选项来支持。

对于涉及到C扩展的代码打包与分发就更复杂点了。 第15章对关于C扩展的这方面知识有一些详细讲解,特别是在15.2小节中。

编辑 (opens new window)
上次更新: 2023/10/13, 17:39:25
创建新的Python环境
作为客户端与HTTP服务交互

← 创建新的Python环境 作为客户端与HTTP服务交互→

最近更新
01
牛客网非技术快速入门SQL练习题
03-08
02
其他日常SQL题
03-07
03
用户与权限管理
03-05
更多文章>
Theme by Vdoing | Copyright © 2021-2023 | Weibw | 辽ICP备18015889号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式