我来过这里:
还有很多我没有复制的网址,有些在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会给出错误信息,非包装意味着什么!,为什么以及如何定义"包裹",并且准确的答案足以让幼儿园儿童理解.
编辑:导入是从控制台完成的.
我想将子文件夹导入为模块.因此每个子文件夹都包含一个__init__.py.我的文件夹结构是这样的:
src\
main.py
dirFoo\
__init__.py
foofactory.py
dirFoo1\
__init__.py
foo1.py
dirFoo2\
__init__.py
foo2.py
Run Code Online (Sandbox Code Playgroud)
在我的主脚本中我导入
from dirFoo.foofactory import FooFactory
Run Code Online (Sandbox Code Playgroud)
在这个工厂文件中,我包含子模块:
from dirFoo1.foo1 import Foo1
from dirFoo2.foo2 import Foo2
Run Code Online (Sandbox Code Playgroud)
如果我调用我的foofactory我得到错误,那python无法导入子模块foo1和foo2:
Traceback (most recent call last):
File "/Users/tmp/src/main.py", line 1, in <module>
from dirFoo.foofactory import FooFactory
File "/Users/tmp/src/dirFoo/foofactory.py", line 1, in <module>
from dirFoo1.foo1 import Foo1
ImportError: No module named dirFoo1.foo1
Run Code Online (Sandbox Code Playgroud) from ..box_utils import decode, nms
Run Code Online (Sandbox Code Playgroud)
该行显示错误
ImportError:尝试相对导入,没有已知的父包
这是什么错误,以及如何解决该错误?
使用 CTRL+F5 从 VS Code 运行 Python 测试时,我收到错误消息
导入错误:尝试在没有已知父包的情况下进行相对导入
使用命令行从 VS Code 终端运行 Python 测试时
python test_HelloWorld.py
我收到错误消息
ValueError:尝试在顶级包中进行相对导入
这是项目结构
如何以最少的(代码/项目结构)更改工作解决主题问题?
蒂亚!
[更新]
我使用 sys.path 更正得到了以下解决方案:
import sys
from pathlib import Path
sys.path[0] = str(Path(sys.path[0]).parent)
Run Code Online (Sandbox Code Playgroud)
但我想通过使用一些(VS 代码)设置或 Python 运行上下文/环境设置(文件),仍然可以有更有效的解决方案,而无需更正源代码?
import ×3
python ×3
decode ×1
module ×1
nms ×1
package ×1
python-2.7 ×1
python-3.x ×1
subdirectory ×1