[英]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
,但是正如这个答案所建议的那样,我将语句修改为前一种形式。
最终目标是要有一个程序包,我可以从中使用东西,而且要在程序包内安装可执行脚本,以导入该程序包的其他部分。 显然,经过几天的搜索和一些问题,我仍然不太了解进口和包装机械。
原因可能是:
__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.