首先,让我澄清一件事,如果你只需要使用其中的一部分,那么导入整个模块并不是一个好主意。相反,您可以使用
from
来仅导入库/包下的特定函数。通过这样做,您可以在内存和性能方面使程序更加高效。
要了解更多,请参考以下内容:
- 'import module' or 'from module import'
- difference between import and from
现在让我们看看解决方案。
在开始解决方案之前,让我澄清一下
__init__.py
文件的用途。它只告诉python解释器,该目录下的
*.py文件可导入,也就是它们是模块且可能是包的一部分。
因此,如果您有N个子目录,则必须在所有这些子目录中放置
__init__.py
文件,以便它们也可以被导入。在
__init__.py
文件中,您还可以添加一些其他信息,例如应包含哪些路径、默认函数、变量、作用域等。要了解这些信息,请通过谷歌搜索
__init__.py
文件或查看一些Python库中的相同
__init__.py
文件。
更多信息:
- modules
- Be pythonic
因此,正如
@Sushant Chaudhary所述,您的项目结构应如下:
proj-dir
--|--__init__.py
--package1
--|--__init__.py
--|--module1.py
--package2
--|--__init__.py
--|--module2.py
如果我像上面那样将
__init__.py
文件放在我的目录下,它是否可以被导入并正常工作呢?是和否。
是:
如果您在项目/包目录内导入模块。例如,在您的情况下,您正在将package1.module1导入到pakage2.module2中,如
from package1 import module1
。
在这里,您必须在子模块中导入
基本目录,为什么?如果您从相同位置运行模块,则项目将正常运行
即:在package2中作为python module2.py,但如果您从其他目录运行模块,则会抛出ModuleNotFoundError
即:任何路径,除了在package2下面的路径之外,例如在proj-dir下的 python package2/module2.py
。这就是您的情况所发生的事情,您正在从project-dir中运行该模块。
如何解决这个问题?
您需要在module2.py中将basedir路径附加到系统路径中:
from sys import path
dir_path = "/absolute/path/to/proj-dir"
sys.path.insert(0, dir_path)
这样module2就能够找到package1(以及其中的module1)。
2- 您需要在proj-dir的__init__.py
文件中添加所有子模块路径。
例如:
def get_include():
"""
Returns a list of header include paths (for lxml itself, libxml2
and libxslt) needed to compile C code against lxml if it was built
with statically linked libraries.
"""
import os
lxml_path = __path__[0]
include_path = os.path.join(lxml_path, 'includes')
includes = [include_path, lxml_path]
for name in os.listdir(include_path):
path = os.path.join(include_path, name)
if os.path.isdir(path):
includes.append(path)
return includes
这是
lxml 的
__init__.py
文件(一个用于解析html、xml数据的python库)。您可以参考任何带有子模块的Python库中的
__init__.py
文件。
例如(os,sys)。我提到了
lxml,因为我认为这样更容易让您理解。您甚至可以查看其他库/包下的
__init__.py
文件。每个文件都有自己定义子模块路径的方式。
如果您想在目录外导入模块,则必须将模块路径导出,以便其他模块可以在环境变量中找到它们。这可以通过将基本目录的绝对路径附加到
PYTHONPATH或
PATH来直接完成。
要了解更多信息,请参见:
- 操作系统中的PATH变量
- PYTHONPATH变量
因此,为了解决您的问题,请在
proj-dir下的
__init__.py
文件中包含所有子模块的路径,并将
/absolute/path/to/proj-dir添加到
PYTHONPATH
或
PATH
中。
希望这个答案可以解释关于__init__.py
的用法并解决您的问题。
__init__.py
文件。这是Python分发包的标准。 - KeatsKelleher__init__.py
文件。并且你的导入应该基于你正在执行项目的位置,以避免所有路径操作。 - idjaw/utils
和/processing
文件夹中添加__init__.py
并移除sys.path.append(...)
后,我遇到了ModuleNotFoundError: No module named 'src'
的错误。您能否提供更详细的解答? - blahblahblah__init__.py
的含义。 - idjaw