模块自我引用

5

我想从应用程序特定的终端(在这个例子中是Maya,但最终可能会有其他应用程序)导入一个模块。我从git上下载了一个项目,并且我的目录结构如下:

modulename
    submodule
        __init.py__
        subsubmodule
        ...
    submodule
    ...
    __init.py__
    modulename.py

然后在我的执行 shell 中,我尝试导入该模块以在 shell 上使用,所以我有:

import sys,os
modulepath = 'C:/path/to/module'
sys.path.append(modulepath)
import modulename

如果导入的 modulename.py 是空白的,则一切正常。然而,模块的前两行是模块尝试导入自身(我不知道为什么,因为这是别人的项目,但似乎对结构很重要)。
import sys,os
import modulename from modulename as mod

这将会出现错误:

# Error: ImportError: cannot import name modulename# 

仅此而已,没有其他步骤。

最终,我想知道为什么一个模块不能导入自身,以及如何解决这个问题?

我读到过一个模块认为它自己被命名为main,因此相对导入不起作用,如果是这种情况,我会期望:

import __main__ as mod

要代替它工作,但也存在错误:

# Error: ImportError: Cannot re-init internal module __main__ #

这完全有道理。

[问题是,我如何从模块本身导入一个模块?]


你尝试过使用 from modulename import modulename as mod 吗? - Kobi K
是的,和第一个错误一样的 ImportError。 - D W
1个回答

10
你所看到的是一个名为“modulename”的包,其中包含一个名为“modulename”的子模块。换句话说,“modulename.modulename”。这在Python中完全有效。 modulename.py模块试图从包中的某个地方也称为“modulename”的其他地方导入内容。这就是为什么它“看起来像”尝试从自己导入。可以承认这很令人困惑,这就是我通常不使用此类命名的原因;)
导入无法工作,因为您将顶级包“modulename”添加到sys.path中,而应该添加父目录。包结构很重要。
您可以通过包含一个__init__.py文件来告诉Python项目中的目录是包。
更新:当我最初编写它时,它针对的是Python 2.x。在Python 3中,包含Python模块的目录会自动被视为包,无论是否有__init__.py。
顺便说一下,我不知道你正在尝试使用什么软件,但万一它包括一个setup.py,你应该使用它来安装它。
(顺便说一句,我不相信原始文件实际上包含import modulename from modulename as mod,因为那是无效的语法。)

好的,这就是它的设置方式,但是该项目本身是从另一种语言移植过来的,并且在某个地方被放弃了,我正在尝试恢复它,所以可能有人留下了一些不起作用的东西。由于我正在尝试分析发生了什么,并且保持当前的项目结构目录方式,您建议使用哪种语法来进行导入? - D W
据我所知,虽然您的答案很全面,但我似乎无法根据“模块名.模块名”的方式进行导入。我仍然遇到相同的ImportErrors错误。 - D W
嗯,我想我差不多成功了,虽然似乎无法访问子包。我会尝试独立解决这个问题,因为它在技术上是一个不同的问题。谢谢。 - D W
如果您指向实际代码可能会更有帮助,但我可以理解如果您不想牵连到其原始作者;) - Iguananaut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接