繁体   English   中英

无法将模块导入同一目录和包中

[英]Cannot import module in same directory and package

我正在使用from . import module from . import module语句可以完全做到这一点:将本地模块导入到我的脚本中。 脚本和模块位于同一文件夹中。

# module.py
def foo():
    print('Foo!')

# script.py
from . import module
module.foo()

> ImportError: cannot import name 'module'

这应该很容易,并且只需执行import module ,但是正如这个答案所建议的那样,我将语句修改为前一种形式。

最终目标是要有一个程序包,我可以从中使用东西,而且要在程序包内安装可执行脚本,以导入该程序包的其他部分。 显然,经过几天的搜索和一些问题,我仍然不太了解进口和包装机械。

原因可能是:

  • 导入语句在2.7和3.x中不同,我使用的是3.6,问题在2.7上
  • 相对导入在包内部是不同的(带有__init__.py文件夹)
  • 工作目录不同或文件夹不在sys.path

拥有__init__文件至少在PyCharm中的新项目中没有任何不同。 同样,工作目录设置为源文件夹,并且位于path

我错过了什么吗? 或者说, 实现最终目标中描述的功能的正确方法是什么? 任何帮助是极大的赞赏!

自从写完这个答案以来,我意识到用pip install -e .安装软件包会更方便和更好pip install -e . 并使用绝对进口。 因此,即使在from package.sub.module import thing编写from package.sub.module import thing 这使得重构变得容易得多,并且不需要操纵模块变量或sys.path


当直接运行脚本时,Python将该脚本的名称(特殊变量__name__ )视为"__main__" 如果是导入,则将名称设置为模块的名称。 在后一种情况下,相对进口是可以的。 但是import实际上会查看__name__和另一个特殊变量__package__的组合,对于已执行的脚本,此变量为None ,但对于导入的模块(例如parent.sub ,则为该模块的路径。

搜索的变量是... drumroll ...

__package__ + '.' + __name__

秘密成分是操纵__package__

# script.py
__package__ = 'package_name'   # or parent.sub.package
from . import module

这让Python的知道你即使脚本直接执行的包内。 但是,顶级文件夹必须位于sys.path ,并且程序包名称必须反映该目录结构。

请参阅有关相对进口的非常全面的答案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM