我应该如何为python包编写一个简单的安装程序?

时间:2014-08-26 17:46:19

标签: python python-3.x installer package

我正在编写一个简单的python包,其中包含许多辅助函数,可用于其他项目。 应该如何处理我的包装并为所述包装制作安装程序?

目录布局

package (/git/dev/package)
 |
 +-- __init__.py
 |
 +-- foo.py
 |
 +-- bar.py

项目使用所述套餐:

project (/git/dev/project)
 |
 +-- project.py

如何让这个包可用于每个本地python项目(我不需要公开发布)?安装程序是否应将当前包位置添加到路径或使用其他方式?

目前首选的工作流程:

1. checkout package from version control
2. do something so python finds and can use that said package
3. use package in some project
4. edit package (project should use edited package even before I push those changes to repo)

文件内容

project.py:

# Doesn't work currently since package isn't added to path
from package import foo
from package import bar

foo.do_stuff()
bar.do_things()

1 个答案:

答案 0 :(得分:2)

  

如何让这个包可用于每个python项目?

分发包的标准方法是作为PyPI(或私有pip - 兼容存储库)的源代码分发。详细信息占用了很多页面,因此我无法在此解释所有内容,但Python Packaging User Guide包含了您想知道的所有内容。

基本思想是创建一个setup.py文件,告诉Python如何安装程序。请看the official sample linked from the tutorial

现在,有人可以下载并解压缩您的软件包并运行python setup.py install,它将为您安装程序。或者,更好的是,他们可以输入pip install .

但是,更好的是,您可以python setup.py sdist创建源代码分发,测试它,将其上传到PyPI,然后用户不必下载任何内容,只需{{1} }。

如果您希望为不同平台安装二进制文件,pip install mylib知道如何制作可以双击并运行的Windows安装程序,以及可以安装{{1}的setuptools文件(实际上,它会自动查找和使用轮子而不是源分发)。如果您没有任何已编译的C扩展名,wheel就足以构建一个适用于所有地方的轮子。


  

安装程序是否应将当前包位置添加到路径或使用其他方式?

安装程序应将软件包安装到用户的系统或用户(或current-virtual-environment-system)站点软件包中。如果您使用pippython setup.py bdist_wheel --universal会自动处理此问题。


如果您不想公开此内容,仍可以使用setuptoolspip。只需将源代码分发检查到源代码管理中,然后就可以随时安装最新版本:

setuptools

这也意味着你可以在setup.py文件中跳过很多PyPI元数据(例如,如果它不会在PyPI存储库中结束,没有人会关心你的项目的分类器) 。

但您仍然可以利用Python打包系统的所有部分,让您的生活更轻松,同时跳过不相关的部分。