我们能否对python包装和进口如何运作有一些明确的认识?

Ste*_*ini 39 python packaging

我有机会完成模块的python管理,每次都是一个挑战:包装不是人们每天所做的事情,它成为学习的负担,也是记忆的负担,即使你真的这样做,因为这通常发生一次.

我想在这里收集有关导入,包管理和分发如何在python中运行的权威概述,以便这个问题成为所有在幕后发生的魔术的明确解释.虽然我理解问题的广泛层面,但这些事情是如此交织在一起,以至于任何有针对性的答案都无法解决主要问题:了解所有工作是什么,什么是过时的,什么是当前的,什么是同一任务的替代品,什么是怪癖.

要引用的关键字列表如下,但这只是一堆样本.还有更多,欢迎您添加其他详细信息.

  • 的PyPI
  • setuptools/Distribute
  • 的distutils
  • 鸡蛋链接
  • 果仁
  • 的zipimport
  • site.py
  • 站点包
  • .pth文件
  • 的virtualenv
  • 处理鸡蛋中已编译的模块(通过easy_install安装和不安装)
  • 使用get_data()
  • pypm
  • 便当
  • PEP 376
  • 奶酪店
  • eggsecutable

链接到其他答案可能是一个好主意.正如我所说,这个问题是为了高级概述.

std*_*err 11

在大多数情况下,这是试图查看包装/分销方面,而不是机械方面import.不幸的是,打包是Python提供多种方式的地方.我只是想让球滚动,希望其他人能帮我填补我的想法或指出错误.

首先,这里有一些杂乱的术语.包含__init__.py文件的目录是包.但是,我们在这里讨论的大部分内容都是在PyPI上发布的特定版本的软件包,其中一个是镜像,或者是特定于供应商的软件包管理系统,如Debian的Apt,Redhat的Yum,Fink,Macports,Homebrew或者ActiveState的pypm.

这些已发布的软件包正在尝试将"分发"称为"分发",试图仅将"Package"用作Python语言构造.您可以在PEP-376 PEP-376中看到一些用法.

现在,您的关键字列表与Python生态系统的几个不同方面有关:

查找和发布python发行版:

  • PyPI(又名奶酪店)
  • PyPI镜子
  • 各种包管理工具/系统:apt,yum,fink,macports,homebrew
  • pypm(ActiveState替代PyPI)

以上是提供以各种格式发布Python发行版的地方的所有服务.有些像PyPI镜像和apt/yum存储库可以在您的本地计算机或公司网络中运行,但人们通常使用官方计算机.大多数(如果不是全部)提供工具(或PyPI的多个工具)来帮助查找和下载分发.

用于创建和安装发行版的库:

  • setuptools /分发
  • distutils

Distutils是Python包编译并构建到发行版中的标准基础结构.有大量的功能,distutils但大多数人都知道:

from distutils.core import setup

setup(name='Distutils',
      version='1.0',
      description='Python Distribution Utilities',
      author='Greg Ward',
      author_email='gward@python.net',
      url='http://www.python.org/sigs/distutils-sig/',
      packages=['distutils', 'distutils.command'],
 )
Run Code Online (Sandbox Code Playgroud)

在某种程度上,这是你需要的大部分内容.使用前面的9行代码,您可以获得足够的信息来安装纯Python包,以及在PyPI上发布该包所需的最小元数据.

Setuptools提供了支持Egg格式及其所有功能和缺陷所必需的钩子.分发是Setuptools的替代方案,它在尝试大多向后兼容时添加了一些功能.我相信Distribute将作为Distutil的继承者包含在Python 3中from distutils.core import setup.

Setuptools和Distribute都提供了一个自定义版本的distutilssetup命令,可以执行支持Egg格式等有用的操作.

Python分发格式:

通常将分发提供为源归档(tarball或zipfile).安装源代码分发的标准方法是下载和解压缩归档,然后在其中运行该setup.py文件.

例如,以下将下载,构建和安装Pygments语法高亮库:

curl -O -G http://pypi.python.org/packages/source/P/Pygments/Pygments-1.4.tar.gz
tar -zxvf Pygments-1.4.tar.gz
cd Pygments-1.4
python setup.py build
sudo python setup.py install
Run Code Online (Sandbox Code Playgroud)

或者,您可以下载Egg文件并进行安装.通常,这是通过使用easy_install或pip来完成的:

sudo easy_install pygments
or 
sudo pip install pygments
Run Code Online (Sandbox Code Playgroud)

鸡蛋的灵感来自Java的Jarfiles,它们有很多你应该在这里阅读的功能

Python包格式:

  • 未压缩的目录
  • zipimport(zip压缩目录)

普通的python包只是一个包含__init__.py文件和任意数量的附加模块或子包的目录.Python也支持在*.zip文件中查找和加载源代码,只要它们包含在PYTHONPATH(sys.path)中即可.

安装Python包:

  • easy_install:原蛋安装工具,取决于 setuptools
  • pip:目前最流行的安装python包的方法.类似easy_install但更灵活,并具有一些很好的功能,如需求文件,以帮助记录依赖关系和重现部署.
  • pypm,apt,yum,芬克等

环境管理/自动部署:

  • bento
  • buildout
  • virtualenv(和virtualenvwrapper)

上述工具用于帮助自动化和管理Python项目的依赖项.基本上,它们为您提供工具来描述您的应用程序所需的发行版,并自动安装这些特定版本的依赖项.

包/分发的位置:

  • 站点包
  • PYTHONPATH
  • 当前工作目录(取决于您的操作系统和环境设置)

默认情况下,安装python发行版会将其放入site-packages目录中.该目录通常是这样的/usr/lib/pythonX.Y/site-packages.

查找site-packages目录的简单编程方法:

from distuils import sysconfig
print sysconfig.get_python_lib()
Run Code Online (Sandbox Code Playgroud)

修改你的PYTHONPATH的方法:

Python的import语句只能找到位于你的一个目录中的软件包PYTHONPATH.

您可以通过访问以下内容来检查和更改Python中的路径:

import sys
print sys.path
sys.path.append("/home/myname/lib")
Run Code Online (Sandbox Code Playgroud)

除此之外,您可以PYTHONPATH像操作系统上的任何其他环境变量一样设置环境变量,也可以使用:

  • .pth文件:*.pth文件位于已经PYTHONPATH读取的目录中,*.pth文件的每一行都添加到您的PYTHONPATH.基本上,只要你将包复制到PYTHONPATH你的目录上,你就可以创建一个mypackages.pth.阅读有关*.pth文件的更多信息: 站点模块
  • egg-link文件:python egg的内部结构,它们是符号链接的跨平台替代品.创建egg链接文件与创建pth文件类似.
  • site.py 修改

/home/myname/lib使用*.pth文件将上述内容添加到site-packages,您需要创建一个*.pth文件.文件的名称无关紧要,但你仍然应该选择合理的东西.

让我们创建myname.pth:

# myname.pth
/home/myname/lib
Run Code Online (Sandbox Code Playgroud)

而已.将其放入sysconfig.get_python_lib()您的系统或您的任何其他目录中PYTHONPATH,/home/myname/lib并将其添加到路径中.