有些代码已被重构以使直接导入,并且有一些混乱的恢复提交等。我得到一个ImportError
并且不太了解Python导入系统以便知道原因。花了很长时间看分支机构之间的比较等但却找不到它是什么..
鉴于以下目录结构,
our_project/
__init__.py
directory1/
__init__.py
file1.py
file2.py
file3.py
directory2/
__init__.py
file3.py
file4.py
file5.py
directory3/
__init__.py
file6.py
file7.py
file8.py
除了__init__.py
目录中包含一些代码的our_project/
之外,所有directory3/file7.py
都是空的。
ImportError
顶部的以下内容是否有效,而不会导致from out_project.directory1.file1 import my_function
:
from our_project.directory1 import my_function
或者你需要写
__init__.py
?
感觉好像这个空console.log
以某种方式干扰了事情。
答案 0 :(得分:2)
文件夹布局建议的顶级包是our_project
。这意味着包含它的文件夹应该在Python搜索路径中。
然后您可以使用from our_project.directory1.file1 import my_function
从任何地方进行绝对导入。
在my_project.directory3.file7
模块中,您可以改为使用相对导入from ..directory1.file1 import my_function
。
如果您将file7.py
作为脚本运行(在命令行中使用python file7.py
),则相对导入可能无效。通过文件名运行包中的脚本通常是一个坏主意,因为解释器将无法分辨它们应该放在包层次结构中的位置。而是使用python -m our_project.directory4.file7
以其绝对名称运行模块。
以下是python docs的链接,其中有一个很好的教程,其中解释了所有内容。
答案 1 :(得分:2)
init .py文件只是告诉python将该目录视为python包,所以我相信你将如何导入取决于系统上安装了哪些软件包(它会搜索你的PYTHONPATH找到已安装的软件包/模块)。如果只安装了示例中的our_project包,则需要像
一样导入 from our_package.directory1.file1 import my_function
您还可以使用相对导入,无论安装什么都可以使用
from .directory1.file1 import my_function
有关软件包的文档位于:https://docs.python.org/3/tutorial/modules.html#packages
模块搜索路径的信息在这里: https://docs.python.org/3/tutorial/modules.html#the-module-search-path