0

我在python中有以下库设置:

library
  | - __init__.py
  | - lib1.py
  | - ...
  | - tools
        | - __init__.py
        | - testlib1.py

所以换句话说,该目录library包含python模块和目录tools,它是一个子目录,library包含例如一个testlib1.py用于测试库的文件lib1.py

testlib1.py因此需要lib1.py从上面的目录导入来做一些测试等,只需python testlib1.py从计算机上的某个地方调用,假设文件在搜索路径中。另外,我只想PYTHONPATH指定一个。

但是我们都知道下面的想法 fortestlib1.py是行不通的,因为相对导入是行不通的:

from .. import lib1
...
do something with lib1

我接受两种答案:

  1. 一个答案,它描述了如何仍然可以testlib1.py直接调用作为正在执行的 python 脚本。
  2. 一个解释模块等概念设置的更好的答案,前提是所有内容都必须位于目录中project,并且工具必须位于与实际库不同的目录中。

如果有不清楚的地方,我建议问,我会更新问题。

4

3 回答 3

0

尝试将 a 添加__init__.pytools目录中。相对导入应该有效。

于 2013-02-05T12:33:51.667 回答
0

你不能。如果您打算使用相对导入,那么您不能单独运行该模块。要么放弃相对导入,要么放弃testlib1.py直接运行的想法。

另外我相信测试文件不应该使用相对导入。测试应该检查库是否工作,因此代码应该尽可能地与用户实际使用的代码相似。并且通常用户不会将文件添加到库中以使用相对导入,而是使用绝对导入。

顺便说一句,我认为您的文件组织过于“类 java”:混合源代码和测试。如果您想进行测试,那么为什么不使用以下内容:

project/
   |
   +-- src/
   |    |
   |    +--library/
   |    |     |
   |    |     +- lib1.py
   |    |     |
   |    |    #...
   |    +--library2/ #etc.
   |
   +-- tests/
        |
        +--testlibrary/
        |      |
        |      +- testlib1.py
        #etc

要运行测试,只需使用一个工具nosetests,它会自动查找这种文件夹结构并提供大量选项来更改搜索/测试设置。

于 2013-02-05T12:49:48.927 回答
0

实际上,我找到了一个解决方案,它确实

  1. 与当前实现一起工作
  2. 不需要任何更改PYTHONPATH
  3. 无需硬编码 top-lebel 目录

testlib1.py下面的代码中会做(已经测试):

import os
import sys
dirparts = os.path.dirname(os.path.abspath(__file__)).split('/')
sys.path.append('/'.join(dirparts[:-1]))

import  mylib1

不完全确定这是一个非常干净或直接的解决方案,但它允许从上一级目录导入任何模块,这是我所需要的(因为测试代码或额外代码或无论是否始终位于实际模块的下一级文件)。

于 2013-02-05T18:27:33.797 回答