【问题标题】:Importing package within that package doesn't work in 2.7.15rc1 but does in 2.7.15在该包中导入包在 2.7.15rc1 中不起作用,但在 2.7.15 中起作用
【发布时间】:2019-01-13 22:40:28
【问题描述】:

我正在使用 python Flask 制作一个网站(不需要回答问题的烧瓶知识)。在我的 PC 上,我正在运行 python 2.7.15,并且该应用程序运行良好。当我使用 python 2.7.15rc1 将它移到我的 Ubuntu 网络服务器上时,它停止工作。我正在使用某种循环导入,但我确保它一切正常(我可以很好地处理循环导入)。这是回溯:

Traceback (most recent call last):
   File "/var/www/OpenNoteFlask/opennoteflask.wsgi", line 7, in <module>
     from OpenNoteFlask import app as application
   File "/var/www/OpenNoteFlask/OpenNoteFlask/__init__.py", line 1, in <module>
     from OpenNoteFlask import create_app
   File "/var/www/OpenNoteFlask/OpenNoteFlask/OpenNoteFlask/__init__.py", line 11, in <module>
     from OpenNoteFlask.config import Config
 ImportError: No module named config

这是我的文件结构:

(The numbers in parenthesis are to distinguish the files and folders here.
They do not appear in the actual names of the files and folders)

OpenNoteFlask (1)
    __init__.py (1)
    OpenNoteFlask (2)
        __init__.py (2)
        config.py

__init__.py (1) 里面我有from OpenNoteFlask import create_app(它发现导入成功)。

__init__.py (2) 里面我有from OpenNoteFlask.config import Config(它没有找到导入)。同样,这只发生在我的 Ubuntu 网络服务器上,而不是我的 PC 上。

我已经试过了:

import sys
sys.path.insert(0, "path to parent of OpenNoteFlask (2)")
from OpenNoteFlask.config import Config

但这不会改变任何事情。

重申一下,我有包OpenNoteFlask,其中有一个__init__.py 文件,该文件导入了相同的OpenNoteFlask 包的config.py 模块,但找不到该模块。这只发生在运行 python 2.7.15rc1 的 Ubuntu 网络服务器上,但在运行 python 2.7.15 的 PC 上运行良好。

为什么会发生这种情况,我该如何解决或解决它?

编辑:解决方案

我并没有直接将所有内容命名为相同的名称。这就是问题所在,正如 cmets 中指出的那样:

在我的电脑上,这是文件结构:

OpenNote
    __init__.py
    OpenNoteFlask
        __init__.py
        config.py

在我的网络服务器上,这是文件结构:

OpenNoteFlask
    __init__.py
    OpenNoteFlask
        __init__.py
        config.py

问题最终是因为我在一个名为 OpenNoteFlask 的包内有一个名为 OpenNoteFlask 的包,所以导入 from OpenNoteFlask ... 不明确。 Python 将该导入解释为从父包而不是子包导入。解决方案是使两个包名称不同(例如在我的 PC 上)。

【问题讨论】:

  • 为什么在一个名为OpenNoteFlask 的包中还有一个名为OpenNoteFlask 的包?这只会使import OpenNoteFlaskOpenNoteFlask 中产生歧义,因为它可能是相对的或绝对的。我不确定这是否是问题的原因,但它肯定没有帮助。
  • @zvone 啊,我明白了。我不知道我在想什么。现在我想了想,错误正在发生是有道理的。我能够确定这是问题所在。我会把它添加到我的问题中。
  • @PaoloCastro 请添加解决方案作为此问题的单独答案。

标签: python import package circular-dependency


【解决方案1】:

导入不起作用的原因是因为我使用了同名的包。您可以通过执行以下操作来复制此错误:

run.py
package
    __init__.py
    package
        __init__.py
        module.py
# run.py
import package

# package/__init__.py
import package

# package/package/__init__.py
from package import module

问题似乎是当第一个package 被调用时,python 记得第一个package 是THE package。当调用第二个package 时,它首先在自己的目录中搜索并找到第二个package 并导入它。在第三次导入时,目录中没有另一个package,因此它记得package 是第一个包并尝试导入它。但由于module.py 文件不是第一个package 的一部分,因此导入失败。

解决方法很简单:不要有两个同名的嵌套包!

【讨论】:

    猜你喜欢
    • 2018-06-10
    • 2020-01-12
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    相关资源
    最近更新 更多