简单的 python 导入失败

Dav*_*ave 4 python

我对为什么简单的绝对导入失败感到困惑。按照 Python教程,我有一个带有单个子包的包:

sound/
    __init__.py
    top.py
    formats/
        __init__.py
        a.py
        b.py
Run Code Online (Sandbox Code Playgroud)

a.py 包含:

def foo():
    print("foo")
Run Code Online (Sandbox Code Playgroud)

b.py 包含:

from a import foo

def bar():
    foo()

if __name__ == "__main__":
    bar()
Run Code Online (Sandbox Code Playgroud)

top.py 包含:

from formats import b    

if __name__ == "__main__":
    b.bar()
Run Code Online (Sandbox Code Playgroud)

两个__init__.py文件都是空的。从声音/格式/,foo按预期运行 b 打印。但是从 sound/,运行 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'
Run Code Online (Sandbox Code Playgroud)

(注意第一行正斜杠和第二行反斜杠的奇怪外观。Python 3.5,Windows 7 Pro。)这不应该那么复杂——需要什么语法才能让 b 始终导入 a?

- - - 编辑 - - -

运行 unittest是我在问这个问题之前应该找到的问题。它还包含一个很好的指向Python Project Howto 的指针。

Way*_*ner 5

这真的不是你应该如何运行你的代码。

使用 Python 包时,您不应在运行代码时位于包含文件的文件夹中。那就像去C:\Python35\Lib\site-packages\http\* 然后运行py -3 server.py. 呃。不要那样做。

相反,以预期的方式使用 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)
Run Code Online (Sandbox Code Playgroud)

您正在创建模块,但希望能够将它们作为脚本运行。事实证明你可以做到!

> cd ../..
> dir
sound
> python -m sound.formats.b
foo
> python -m sound.top
foo
Run Code Online (Sandbox Code Playgroud)

*我认为这就是路径,但自从 Windows 对我来说已经有一段时间了。如果是错的,我只是想在这里说明一点!