无法在同一目录和包中导入模块
Cannot import module in same directory and package
我正在使用 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
至少在 PyCharm 中的新项目中,拥有 __init__
文件并没有什么不同。此外,工作目录设置为源文件夹,它位于 path
.
我错过了什么吗?或者更确切地说,实现最终目标中描述的功能的正确方法是什么?非常感谢任何帮助!
自从写下这个答案后,我意识到以我的拙见,使用 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
这让 Python 知道您 在包中,即使脚本是直接执行的。但是,顶级文件夹需要位于 sys.path
中,包名称必须反映该目录结构。
请参阅 this very comprehensive answer 关于相对导入的主题。
我正在使用 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
至少在 PyCharm 中的新项目中,拥有 __init__
文件并没有什么不同。此外,工作目录设置为源文件夹,它位于 path
.
我错过了什么吗?或者更确切地说,实现最终目标中描述的功能的正确方法是什么?非常感谢任何帮助!
自从写下这个答案后,我意识到以我的拙见,使用 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
这让 Python 知道您 在包中,即使脚本是直接执行的。但是,顶级文件夹需要位于 sys.path
中,包名称必须反映该目录结构。
请参阅 this very comprehensive answer 关于相对导入的主题。