相关疑难解决方法(0)

如何修复"非包装中的尝试相对导入",即使使用__init__.py也是如此

我正在尝试遵循PEP 328,具有以下目录结构:

pkg/
  __init__.py
  components/
    core.py
    __init__.py
  tests/
    core_test.py
    __init__.py
Run Code Online (Sandbox Code Playgroud)

core_test.py我有以下import语句

from ..components.core import GameLoopEvents
Run Code Online (Sandbox Code Playgroud)

但是,当我运行时,我收到以下错误:

tests$ python core_test.py 
Traceback (most recent call last):
  File "core_test.py", line 3, in <module>
    from ..components.core import GameLoopEvents
ValueError: Attempted relative import in non-package
Run Code Online (Sandbox Code Playgroud)

搜索周围我发现" 相对路径甚至不能使用__init__.py "和" 从相对路径导入模块 ",但它们没有帮助.

这里有什么我想念的吗?

python init package python-import importerror

713
推荐指数
9
解决办法
47万
查看次数

Python中的相对导入3

我想从同一目录中的另一个文件导入一个函数.

有时它适用于我,from .mymodule import myfunction但有时我会得到:

SystemError: Parent module '' not loaded, cannot perform relative import
Run Code Online (Sandbox Code Playgroud)

有时它适用from mymodule import myfunction,但有时我也得到:

SystemError: Parent module '' not loaded, cannot perform relative import
Run Code Online (Sandbox Code Playgroud)

我不明白这里的逻辑,我找不到任何解释.这看起来完全随机.

有人可以向我解释这一切背后的逻辑是什么吗?

python python-import python-3.x

589
推荐指数
16
解决办法
38万
查看次数

相对进口数十亿次

我来过这里:

还有很多我没有复制的网址,有些在SO上,有些在其他网站上,当我认为我有快速解决方案的时候.

永远反复出现的问题是:使用Windows 7,32位Python 2.7.3,如何解决这个"非包装中尝试相对导入"的消息?我在pep-0328上构建了一个包的精确副本:

package/
    __init__.py
    subpackage1/
        __init__.py
        moduleX.py
        moduleY.py
    subpackage2/
        __init__.py
        moduleZ.py
    moduleA.py
Run Code Online (Sandbox Code Playgroud)

我确实在适当的模块中创建了名为spam和eggs的函数.当然,它没有用.答案显然在我列出的第4个网址中,但这对我来说都是校友.我访问过的其中一个网址上有此回复:

相对导入使用模块的name属性来确定模块在包层次结构中的位置.如果模块的名称不包含任何包信息(例如,它设置为'main'),则解析相对导入,就像模块是顶级模块一样,无论模块实际位于文件系统的哪个位置.

上面的反应看起来很有希望,但它对我来说都是象形文字.所以我的问题是,如何让Python不回归"尝试非包装中的相对导入"?有一个答案涉及-m,据说.

有人可以告诉我为什么Python会给出错误信息,非包装意味着什么!,为什么以及如何定义"包裹",并且准确的答案足以让幼儿园儿童理解.

编辑:导入是从控制台完成的.

python import relative-path python-2.7

564
推荐指数
8
解决办法
17万
查看次数

Pytest:如何解决测试文件夹中缺少 __init__.py 的问题?

我将所有 pytest 文件存储tests在项目根目录下的子目录中。__init__.py该目录或以上目录中没有pytest tests/test_a.py并按预期工作。我也可以pytest test_a.py直接从tests文件夹中运行。

|--<project_root>
+---[tests]
    test_a.py
    base.py
    config.py
    conftest.py
Run Code Online (Sandbox Code Playgroud)

中的测试类test_a.py继承自base.py. 现在的问题是,由于缺少__init__.pyIDE 工具,因此无法解决导入问题。添加__init__.pytestsIDE 中解决了所有导入错误,但测试将不再运行,pytest test_a.py因为 py.test 无法导入conftest.py

在我的conftest.py我有以下进口:

from config import HOST_URL_DEFAULT, USER, PASSWORD
Run Code Online (Sandbox Code Playgroud)

这导致:

ModuleNotFoundError: No module named 'config'
ERROR: could not load /project_root/tests/conftest.py
Run Code Online (Sandbox Code Playgroud)

有没有办法解决这个问题,这样两个 IDE 工具都可以工作 pytest继续工作?如果可能,我想避免使用点导入。

更新:阅读此答案后,我想我终于开始更多地了解 python 导入的工作原理了。

python pytest

7
推荐指数
1
解决办法
4801
查看次数