【问题标题】:Strange behavior in import进口中的奇怪行为
【发布时间】:2013-11-17 19:11:00
【问题描述】:

我在导入模块时遇到问题。 如果我使用,

 import fruit as f
 print f.apple.juice.CALORIES_INT

这行得通。 还有

 import fruit.apple.juice as j
 print j.CALORIES_INT

不起作用。它抛出AttributeError: 'module' object has no attribute 'apple'。关于如何调试它的任何建议?

我的目录结构如下:

fruit  
--- __init__.py  
--- apple  
---------__init__.py  
--------- juice.py  
---------------CALORIES_INT is a variable declared here  
--- orange  
--------- __init__.py  
--------- shake.py  
---------------trying to access CALORIES_INT here by importing it. 

apple 是一个包。不过我可以导入其他包。

【问题讨论】:

  • 您遇到的问题是正常的 Python 行为,与 Pyramid 无关。我为你重新标记了它。 :-)
  • 在这种情况下apple 是什么?我想说,它不是一个模块。
  • apple.py 真的是fruit 下的目录名,还是打错了?
  • 对不起。那是一个错字。已更新问题。

标签: python package python-import


【解决方案1】:

您需要将from . import apple 添加到您的fruit 包的__init__.py 文件中。或者,您可以在同一位置使用from fruit import apple

嵌套包不会自动作为父包的属性使用,这仅在显式导入嵌套包后才有效。

如果您首先使用import fruit.apple,则import fruit; fruit.apple 有效。或者您在 fruit/__init__.py 文件中显式导入 apple 嵌套包,以确保 import fruit; fruit.apple 始终适用于您的 fruit 包的用户。

同样适用于apple 包中的juice 模块;您需要通过将其导入apple__init__.py 来使其可用;添加from . import juice,或使用from fruit.apple import juice 之类的绝对导入。

【讨论】:

  • 当我在fruit/__init__.py 中写入import .apple 时,它会抛出SyntaxError: invalid syntaximport apple 不会给出错误,但会抛出与之前相同的错误。
  • @cisnik:对不起,我的错误,在那里摸索了相对导入,现在更正了。
  • @cisnik:在您的fruit 目录中是否有一个带有__init__.py 文件的apple 子目录apple 是什么?我确实看到我可能误读了您的问题(错误地解释了它),但看起来 apple 是一个对象,而不是一个模块。
  • 你能用这些信息更新你的问题吗?在这里很难在评论中解析。我为我的原始答案构建了一些测试结构,我没有重现你的情况。
  • @cisnik:好的,对于那个结构,我的原始答案有效;我已经在本地再次检查了三次。只是为了验证一下,fruit/__init__.py 中的 from fruit import apple 导入对您不起作用?
【解决方案2】:

试试:

 from fruit.apple import juice as j

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-16
    • 2021-07-03
    • 2017-04-04
    相关资源
    最近更新 更多