我对简单绝对导入失败的原因感到困惑。在Python packages教程之后,我有一个包含一个子包:
sound/
__init__.py
top.py
formats/
__init__.py
a.py
b.py
a.py包含:
def foo():
print("foo")
b.py包含:
from a import foo
def bar():
foo()
if __name__ == "__main__":
bar()
top.py包含:
from formats import b
if __name__ == "__main__":
b.bar()
两个__init__.py
个文件都是空的。从声音/格式/,运行b按预期打印foo
。但是从声音/,运行top会产生错误:
File ".../sound/top.py", line 1, in <module>
from formats import b
File "...\sound\format\b.py", line 1, in <module>
from a import foo
ImportError: No module named 'a'
(注意第一行中正斜杠的奇怪外观和第二行中的反斜杠.Python 3.5,Windows 7 Pro。)这应该不那么复杂 - 允许b一致地导入一个必要的语法?
-----编辑-----
Running unittest是我在问这个问题之前应该找到的问题。它还包含一个指向Python Project Howto的指针。
答案 0 :(得分:4)
你真的不应该如何运行你的代码。
使用Python包时,不应该在您运行代码时包含文件的文件夹中。这就像转到C:\Python35\Lib\site-packages\http\
*然后运行py -3 server.py
。 EW。别这么做。
相反,请按照预期的方式使用Python!
⚘ python --help | grep -e -m
usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ...
-m mod : run library module as a script (terminates option list)
您正在创建模块,但您希望能够将它们作为脚本运行。事实证明你可以做到这一点!
> cd ../..
> dir
sound
> python -m sound.formats.b
foo
> python -m sound.top
foo
* 我认为这是一条道路,但自从Windows以来已经有一段时间了。如果它错了,我只是想在这里指出一点!