Python 从子模块上的模块调用函数

Python 从子模块上的模块调用函数,python,module,python-import,Python,Module,Python Import,我对处理更复杂的模块还很陌生,但我认为是时候在我的工作流程中实现它们了。另外,我没有软件工程背景,所以我的一些语言可能不准确,请原谅我。我的模块文件夹结构如下所示: +-- module_name | +-- ml.py | +-- exp_an.py | +-- plotting.py +-- etl | +-- machine_learning.py | +-- data_manipulation.py 我之所以有两个文件夹,是因为直接在module_name上的脚本是

我对处理更复杂的模块还很陌生,但我认为是时候在我的工作流程中实现它们了。另外,我没有软件工程背景,所以我的一些语言可能不准确,请原谅我。我的模块文件夹结构如下所示:

+-- module_name
|   +-- ml.py
|   +-- exp_an.py
|   +-- plotting.py
+-- etl
|   +-- machine_learning.py
|   +-- data_manipulation.py
我之所以有两个文件夹,是因为直接在
module_name
上的脚本是我们的个人库,可用于大多数项目,而
etl
具有特定于此项目的代码

起初,我将两个文件夹放在同一个目录下,但从
模块名称
导入
etl
时遇到问题

问题是,在
machine\u learning.py
中,我想从
ml.py
调用一个函数。我试着做:

import sys
sys.append('../')
import module_name as mn
但这似乎带来了一些递归性问题,因为当我尝试调用mn.ml时,我得到了一个
mn没有名为ml
error的属性


所以,我的问题是,正确的方法是什么?假设我想调用一个名为
transform()
的函数,它位于我的
machine\u learning.py
脚本中的
ml.py
中。有办法做到这一点吗?有更好的方法吗?谢谢

为了将目录解释为模块,您需要在每个目录中添加uuu init_uuuu.py。您的目录结构如下所示

+-- module_name
|   +-- __init__.py
|   +-- ml.py
|   +-- exp_an.py
|   +-- plotting.py
+-- etl
|   +-- __init__.py
|   +-- machine_learning.py
|   +-- data_manipulation.py
然后使用相对导入来获取模块。示例->

# Inside machine_learning.py you are importing ml.py
import ..ml as ml

ml.transform()
下面是一个较大项目的示例。您可以看到如何使用相对导入,以及目录的_init__uuu.py


听起来您想将
模块名称
etl
(无论该目录是什么)的父目录添加到
PYTHONPATH

完成后,您应该能够完成您要求的所有导入


为了解释
mn没有名为ml
的属性,这是因为您没有导入
ml
。您只是尝试将其用作
mn
的属性,但无法这样做。

sys.append('../')
,它是当前工作目录的父目录,不是从中导入此模块的目录的父目录。如何调用what?Python 3不需要
\uuu init\uuu.py
。但是使用相对导入是否需要
\uuu init\uuuu.py
呢?为什么我不能使用
ml
作为
mn
的属性?执行此操作需要
\uuuu init\uuuuu.py
文件,还是不再支持该文件?