如何在包中包含示例或测试程序?

Geo*_*eas 6 python python-import python-packaging

Python的食谱建议下面的树结构为"典型库包":

projectname/
    README.txt
    Doc/
        documentation.txt
    projectname/
        __init__.py
        foo.py
        bar.py
        utils/
            __init__.py
            spam.py
            grok.py
    examples/
        helloworld.py
Run Code Online (Sandbox Code Playgroud)

您会注意到examples/它们不属于实际包,它位于projectname/projectname/(您将找到__init__.py包的顶层)的实际包中.

好吧,examples/helloworld.py显然需要导入projectname包.

我知道StackOverflow中至少有2-3个相关问题.我不相信这是重复的,因为其他问题要么涉及到包内导入,要么在它们不在同一目录中时从另一个导入一个python模块的一般情况.在打包库时,我特别要求建议的方法.

有没有办法在不修改路径的情况下实现这一目标?如果修改路径是唯一的方法,有没有办法以优雅的方式完成?

让我详细说明最后一点.在Kenneth Reitz的Repository Structure和Python中,出现了类似的结构,tests/而不是examples/.这是完全相同的问题.他建议使用"一个简单(但显式)路径修改来正确解析包." 好的,但这是实际的代码:

import os
import sys
sys.path.insert(0, os.path.abspath('..'))
Run Code Online (Sandbox Code Playgroud)

我真的不喜欢这个..部分.我希望有一个更通用的解决方案,希望能从我选择运行示例(或测试)的任何目录中使用.

nir*_*r0s 4

虽然文件夹树看起来不错,但我认为,从开发人员的角度以及从用户的角度来看,隐含地假设模块可用于导入都是错误的。

确实,从技术上讲,您可以sys.path.insert(0, os.path.abspath('..'))为 python 添加任何路径以允许从中导入,但这意味着您(开发人员)必须确保添加的路径始终位于正确的位置。

用户通常安装软件包来使用它们。开发人员有一个清晰的工作流程:

  1. 安装 pip 和 virtualenv(更好的是 virtualenvwrapper)
  2. 使用 pip 标志以可编辑模式安装包-e,这意味着您对代码所做的任何更改都将直接影响执行。您不必每次更改代码时都重新安装。
  3. 由于您的代码始终已安装(具体来说,site-packages在开发时以用户身份但处于可编辑模式下),因此您始终可以使用任何示例或测试中的显式名称导入包。

一个常见的工作流程:

$ pip install virtualenv
...
$ virtualenv distro
New python executable in /home/nir0s/work/distro/bin/python3
Also creating executable in /home/nir0s/work/distro/bin/python
Installing setuptools, pip, wheel...done.

$ source distro/bin/activate

# install in editable mode
$ pip install -e ~/repos/nir0s/distro/
Obtaining file:///home/nir0s/repos/nir0s/distro
Installing collected packages: distro
  Running setup.py develop for distro
Successfully installed distro

(distro) $ pip freeze
appdirs==1.4.3
-e git+git@github.com:nir0s/distro@e8a182f9d1dbe6391f25...#egg=distro
packaging==16.8
pyparsing==2.2.0
six==1.10.0
Run Code Online (Sandbox Code Playgroud)

该软件包以可编辑模式安装,意味着有一个 Egg-link 文件指向该软件包的目录:

$ cat distro/lib/python3.6/site-packages/distro.egg-link 
/home/nir0s/repos/nir0s/distro
Run Code Online (Sandbox Code Playgroud)

用户将做同样的事情,而无需处理可编辑模式。只需创建虚拟环境并在其中安装软件包即可。然后,当他们完成工作后,他们将删除这些虚拟环境。十分简单。