0

我想"attempted relative import beyond top-level package"通过在导入中包含异常处理来缩小常见错误的范围。

在我的 Django 测试中,DjangoProject/tests.py我编写了相对于自身 ( tests.py) 的导入。执行每个测试文件的默认值unittests.py位于根文件夹中,该文件夹还包括 DjangoProject 文件夹。

attempted relative import beyond top-level package当我将它添加 到我的单元测试时,我得到了错误DjangoProject/tests.py,很明显它来自进口。使用 try/except 我可以写出一个更清晰的错误,所以我不需要猜测为什么以及哪个文件导致了错误。

现在我的代码如下所示:

try:
    from django.utils.safestring import mark_safe
    import json
    from django.conf import settings
    from viewsfunctions import *
    from .. import PoM
    import unittest
except Exception as importex:
    print("Error in the tests.py-imports: "+str(importex))

它首先抛出了所有信息:

"No module named 'viewsfunctions'"

这很有意义并且很有帮助,就像viewsfunctions里面的模块一样DjangoProject。我将这一行替换为:from DjangoProject.viewsfunctions import *

下一个错误是:

Error in the Imports: attempted relative import beyond top-level package

这正是我的问题。这可以是任何东西。通过 pdbing,我可以将其追踪到from .. import PoM(因为模块PoM相对于tests.py顶层文件夹,但相对于unittests.py同一文件夹中的执行)

在这种只有少量导入的情况下,缩小范围相对较快,但是有没有办法编写更好的异常消息或以某种方式传递更多信息,错误实际发生在哪些导入行中?

4

1 回答 1

0

如果您根本捕获异常,您将获得非常有用的回溯:

>>> from .. import foo
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/Users/deceze/...", line 21, in do_import
    module = self._system_import(name, *args, **kwargs)
ImportError: attempted relative import with no known parent package

问题是您正在捕获异常并且仅打印尽可能少的错误消息。如果您出于某种原因确实想捕获异常但仍然收到完整的错误消息,最简单的方法是使用该logging模块

import logging

try:
    ...
except:
    logging.exception('Error fooing the bar')

这将生成您的自定义错误消息,然后是完整的堆栈跟踪

要获得更多手册,请使用traceback模块

import traceback

try:
    ...
except:
    print('Error fooing the bar')
    traceback.print_exc()

借助其中的其他功能,traceback您可以获得更精细的信息,并根据您的喜好从异常中打印或检索消息。

于 2019-12-11T10:26:58.473 回答