首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模块导入自身

模块导入自身
EN

Stack Overflow用户
提问于 2013-12-19 16:23:43
回答 1查看 14.3K关注 0票数 4

我正在尝试从一个特定于应用程序的终端导入一个模块(在本例中是Maya,但最终是其他的)。我已经从git下载了一个项目,并且我有这样一个结构:

代码语言:javascript
复制
modulename
    submodule
        __init.py__
        subsubmodule
        ...
    submodule
    ...
    __init.py__
    modulename.py

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

代码语言:javascript
复制
import sys,os
modulepath = 'C:/path/to/module'
sys.path.append(modulepath)
import modulename

如果正在导入的modulename.py为空白,则一切正常。然而,模块的前两行是试图导入自己的模块(我真的不知道为什么,因为这是某人的项目,但它似乎对结构很重要)

代码语言:javascript
复制
import sys,os
import modulename from modulename as mod

这将得到错误:

代码语言:javascript
复制
# Error: ImportError: cannot import name modulename# 

其他事情都无法进行。

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

我读到一个模块认为自己被命名为main,因此相对导入无法工作,在这种情况下,我希望

代码语言:javascript
复制
import __main__ as mod

代替它工作,这也是错误的:

代码语言:javascript
复制
# Error: ImportError: Cannot re-init internal module __main__ #

这完全是有道理的。

问题是,如何从内部导入模块?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-19 16:42:04

这里有一个叫做“模块名”的包,它包含一个子模块,也称为“模块名”。换句话说,"modulename.modulename“。这在Python中是完全有效的。反过来,modulename.py模块试图从包中的其他地方导入一些东西,也称为“模名”。这就是为什么看起来它试图“从自身”进口。不可否认,这也是为什么我通常尝试不使用这样的命名;)

导入不起作用,因为您应该在添加父目录时将名为"modulename“的顶级包添加到sys.path中。包装结构很重要。

您可以告诉Python项目中的目录是一个包,因为它包含一个__init__.py文件。

更新:我第一次写这篇文章时,是针对Python2.x的。在Python3中,包含Python模块的目录将自动视为包,而不管是否存在__init__.py

顺便说一句,我不知道你想要使用什么软件,但在偶然的情况下,它包括一个setup.py,你应该用它来安装它。

(顺便说一句,我不认为原始文件实际上包含import modulename from modulename as mod,因为这是无效的语法。)

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20686684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档