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

问题描述 投票:0回答:1

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

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

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

> ImportError: cannot import name 'module'

这应该是相当容易的,只做import module确实有效,但正如this answer建议的那样,我将语句修改为前一种形式。

最终目标是拥有一个包,我可以使用它,但也可以在包中导入可执行脚本,导入该包的其他部分。显然,经过几天的搜索和几个问题,我仍然不太了解进口和包装机械。

这可能是原因:

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

拥有__init__文件至少在PyCharm的新项目中没有任何区别。此外,工作目录设置为源的文件夹,它位于path中。

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

python packages python-import
1个回答
1
投票

自从写完这个答案以来,我已经意识到用pip install -e .安装包并使用绝对导入,我认为更方便,更好的风格。所以即使在写一个from package.sub.module import thing的包中。这使得重构变得更加容易,并且不需要操纵模块变量或sys.path


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

搜索到的变量是......鼓号...

__package__

秘密成分是操纵# script.py __package__ = 'package_name' # or parent.sub.package from . import module

sys.path

这让Python知道你在一个包中,即使脚本是直接执行的。但是,顶级文件夹需要在this very comprehensive answer中,包名称必须反映该目录结构。

有关相对进口的主题,请参阅qazxswpoi。

© www.soinside.com 2019 - 2024. All rights reserved.