琐碎的python导入失败

戴夫

我对为什么简单的绝对导入失败感到困惑。在Python软件包教程之后,我提供了带有单个子软件包的软件包:

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文件都是空的。从声音/格式/,foo按预期运行b 但是从声音/,运行顶部会产生错误:

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'

(请注意,第一行中的正斜杠和第二行中的反斜杠是奇怪的外观。Python3.5,Windows 7 Pro。)这应该没那么复杂-允许b始终导入a的语法是什么?

-----编辑-----

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

韦恩·沃纳(Wayne Werner)

这实际上不是您应该如何运行代码的方式。

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

相反,请按照预期的方式使用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以来已经有一段时间了。如果错了,我只是想在这里指出一点!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章