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

时间:2017-03-13 18:31:14

标签: python python-import python-packaging

Python Cookbook"典型的库包" 建议了以下树结构:

projectname/
    README.txt
    Doc/
        documentation.txt
    projectname/
        __init__.py
        foo.py
        bar.py
        utils/
            __init__.py
            spam.py
            grok.py
    examples/
        helloworld.py

您会注意到examples/不属于实际包裹的一部分,该实际包裹位于projectname/projectname/下(您可以在其中找到顶部 - 包的级别__init__.py

嗯,examples/helloworld.py显然需要导入projectname包。

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

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

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

import os
import sys
sys.path.insert(0, os.path.abspath('..'))

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

1 个答案:

答案 0 :(得分:3)

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

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

用户通常会安装包以使用它们。为开发人员提供了明确的工作流程:

  1. 安装pip和virtualenv(甚至更好,virtualenvwrapper)
  2. 使用pip' -e标志以可编辑模式安装软件包,这意味着您对代码所做的任何更改都将直接影响执行。每次更改代码时,都不必重新安装。
  3. 由于您的代码始终是安装的(具体而言,在site-packages下作为用户,但在开发时处于可编辑模式下),您始终可以使用任何示例或测试中的显式名称导入您的包。
  4. 常见的工作流程:

    $ 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
    

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

    $ cat distro/lib/python3.6/site-packages/distro.egg-link 
    /home/nir0s/repos/nir0s/distro
    

    用户将在不处理可编辑模式的情况下执行相同的操作。只需创建虚拟环境并在其中安装包。然后,当他们完成工作后,他们将删除这些虚拟环境。容易腻。