<p>在大多数情况下,这是一种尝试,着眼于包装/分发方面,而不是<code>import</code>的机制。不幸的是,打包是Python提供的不止一种方法的地方。我只是想把事情搞清楚,希望别人能帮我补上我漏掉的或者指出错误。在</p>
<p>首先这里有一些混乱的术语。包含<code>__init__.py</code>文件的目录是一个包。然而,我们在这里谈论的大部分是在PyPI上发布的包的特定版本,它的镜像之一,或者在特定于供应商的包管理系统中发布,比如Debian的Apt、Redhat的Yum、Fink、Macports、Homebrew或ActiveState的pypm。在</p>
<p>这些发布的包是人们试图称之为“分发版”的东西,他们试图将“包”仅用作Python语言结构。您可以在<a href="http://www.python.org/dev/peps/pep-0376/#how-distributions-are-installed" rel="noreferrer">PEP-376</a><a href="http://www.python.org/dev/peps/pep-0376/#how-distributions-are-installed" rel="noreferrer">PEP-376</a>中看到一些这种用法。在</p>
<p>现在,您的关键字列表与Python生态系统的几个不同方面相关:</p>
<h2>查找和发布python发行版:</h2>
<ul>
<li>皮皮(又名奶酪店)</li>
<li>PyPI镜像</li>
<li>各种包管理工具/系统:apt、yum、fink、macports、homebrew</li>
<li>pypm(ActiveState替代PyPI)</li>
</ul>
<p>以上所有的服务都提供了一个地方来发布各种格式的Python发行版。一些,比如pypimirrors和apt/yum存储库可以在您的本地机器上或者您的公司网络中运行,但是人们通常使用官方的。大多数(如果不是全部)都提供了一个工具(或者在PyPI的情况下是多个工具)来帮助查找和下载发行版。在</p>
<h2>用于创建和安装发行版的库:</h2>
<ul>
<li><code>setuptools</code>/分发</li>
<li><code>distutils</code></li>
</ul>
<p>Distutils是标准的基础设施,Python包在其上编译并构建到发行版中。在<code>distutils</code>中有大量的功能,但大多数人只知道:</p>
<pre><code>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'],
)
</code></pre>
<p>在某种程度上,这正是你所需要的。有了前面9行代码,您就有足够的信息来安装纯Python包,以及在PyPI上发布该包的发行版所需的最小元数据。在</p>
<p>Setuptools提供了支持Egg格式及其所有特性和缺点所必需的钩子。Distribute是Setuptools的一种替代方法,它在尽量向后兼容的同时添加了一些功能。我相信Distribute将作为Distutil的<code>from distutils.core import setup</code>的后续版本包含在python3中。在</p>
<p>Setuptools和Distribute都提供<code>distutils</code>setup命令的自定义版本
这样做很有用,比如支持Egg格式。在</p>
<h2>Python分发格式:</h2>
<ul>
<li>来源</li>
<li><a href="http://peak.telecommunity.com/DevCenter/PythonEggs" rel="noreferrer">eggs</a></li>
</ul>
<p>分发通常以源档案(tarball或zipfile)的形式提供。安装源代码发行版的标准方法是下载并解压缩归档文件,然后在其中运行<code>setup.py</code>文件。在</p>
<p>例如,以下命令将下载、构建和安装Pygments语法突出显示库:</p>
^{pr2}$
<p>或者,您可以下载Egg文件并安装它。通常,这是通过使用easy_install或pip来完成的:</p>
^{3}$
<p><a href="http://peak.telecommunity.com/DevCenter/PythonEggs" rel="noreferrer">Eggs</a>的灵感来自Java的jar文件,它们有很多特性您应该阅读<a href="http://peak.telecommunity.com/DevCenter/PythonEggs" rel="noreferrer">here</a></p>
<h2>Python包格式:</h2>
<ul>
<li>未压缩目录</li>
<li>zipimport(zip压缩目录)</li>
</ul>
<p>一个普通的python包只是一个包含<code>__init__.py</code>文件和任意数量的附加模块或子包的目录。Python还支持在*.zip文件中查找和加载源代码,只要它们包含在<code>PYTHONPATH</code>(<code>sys.path</code>)上。在</p>
<h2>安装Python包:</h2>
<ul>
<li><code>easy_install</code>:最初的egg安装工具依赖于<code>setuptools</code></li>
<li><code>pip</code>:目前最流行的安装pyt的方法hon包装。与<code>easy_install</code>类似,但更灵活,并且具有一些很好的特性,如需求文件,以帮助文档依赖关系和重新生成部署。在</li>
<li><code>pypm</code>、<code>apt</code>、<code>yum</code>、fink等</li>
</ul>
<h2>环境管理/自动化部署:</h2>
<ul>
<li><code>bento</code></li>
<li><code>buildout</code></li>
<li><code>virtualenv</code>(和<code>virtualenvwrapper</code>)</li>
</ul>
<p>上述工具用于帮助自动化和管理Python项目的依赖关系。基本上,它们提供了一些工具来描述应用程序所需的发行版,并自动安装依赖项的特定版本。在</p>
<h2>包装/分发的位置:</h2>
<ul>
<li>站点包</li>
<li><code>PYTHONPATH</code></li>
<li>当前工作目录(取决于您的操作系统和环境设置)</li>
</ul>
<p>默认情况下,安装python发行版将把它放到site packages目录中。该目录通常类似于<code>/usr/lib/pythonX.Y/site-packages</code>。在</p>
<p>查找站点包目录的简单编程方法:</p>
<pre><code>from distuils import sysconfig
print sysconfig.get_python_lib()
</code></pre>
<h2>修改PYTHONPATH的方法:</h2>
<p>Python的import语句将只查找位于<code>PYTHONPATH</code>中包含的某个目录中的包。在</p>
<p>您可以从Python中检查和更改路径,方法是访问:</p>
<pre><code>import sys
print sys.path
sys.path.append("/home/myname/lib")
</code></pre>
<p>除此之外,您可以像操作系统上的任何其他环境变量一样设置<code>PYTHONPATH</code>环境变量,或者可以使用:</p>
<ul>
<li>.pth文件:读取位于<code>PYTHONPATH</code>上的目录中的.pth文件,并将*.pth文件的每一行添加到<code>PYTHONPATH</code>。基本上,每当您将一个包复制到<code>PYTHONPATH</code>上的目录中时,您可以创建一个<code>mypackages.pth</code>。阅读有关*.pth文件的更多信息:<a href="http://docs.python.org/library/site.html" rel="noreferrer">site module</a></li>
<li>egg链接文件:<a href="http://svn.python.org/projects/sandbox/trunk/setuptools/doc/formats.txt" rel="noreferrer">Internal structure of python eggs</a>它们是符号链接的跨平台替代品。创建egg链接文件类似于创建pth文件。在</li>
<li><code>site.py</code>修改</li>
</ul>
<p>要将上面的<code>/home/myname/lib</code>添加到带有*.pth文件的站点包中,您需要创建一个*.pth文件。文件名无关紧要,但您还是应该选择一些合理的名称。在</p>
<p>让我们创建<code>myname.pth</code>:</p>
<pre><code># myname.pth
/home/myname/lib
</code></pre>
<p>就这样。{{cd34>将添加到您的目录中。在</p>