【问题标题】:Importing relative packages for testing导入相关包进行测试
【发布时间】:2012-05-08 23:31:13
【问题描述】:

我开发了一个具有以下结构的解决方案:

my_package/
my_test_data/
test.py

test.py我可以轻松导入my_package (from my_package import my_class)。这在我选择的 IDE 中非常有用,我可以在其中编写测试用例、执行它们并最终在需要测试的代码中设置断点。

精细结构,准备发布,改为:

my_package/
tests/
    my_test_data/
    test.py

如果有人想测试安装的东西是否正常工作,这没关系。测试引用已安装的 my_package 版本。问题是在开发过程中我需要从开发文件夹中引用my_package,这样我就可以测试我正在开发的实时版本并最终进入它以进行调试。我试图通过相对导入from .my_package import my_classfrom .. my_package import my_class 和其他组合来解决问题,但我得到了这个异常:

ValueError: Attempted relative import in non-package

有什么帮助吗?

【问题讨论】:

    标签: python import module packages


    【解决方案1】:

    我假设开发结构在/dev下,分布结构在/install下。

    请注意,默认情况下,sys.path 将脚本目录作为其第一个条目。所以,如果test.py 有一个import my_package 语句并且你运行/dev/test.py,它应该找到my_package,即使你的$PYTHONPATH 是空的。如果/install$PYTHONPATH 中的第一个条目,那么运行/install/tests/test.py 应该会为import my_package 找到/install/my_package

    总结:您是否尝试过在test.py 中使用import my_package 并在您的$PYTHONPATH 中包含/install

    【讨论】:

      【解决方案2】:

      仅允许在包内进行相对导入。您不能将目录引用与包处理混淆。

      similar question 上提出的解决方案。

      【讨论】:

      • 谢谢!但是,在我的示例中,我尝试使用 sys.path.append('..') 或 sys.path.append('../') 但 from my_package import my_class 仍然选择已安装的
      猜你喜欢
      • 2016-09-08
      • 2014-02-28
      • 2019-03-17
      • 2019-05-25
      • 2014-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多