Python 从与执行文件相同的指定路径中的文件导入时出现问题

Python 从与执行文件相同的指定路径中的文件导入时出现问题,python,airflow,Python,Airflow,为了有效地构建我的代码,我使用sys.path+=[path\u to\u MODULE]将函数导入我的DAG 结构如下: - MODULE |_run.py |_aux_functions.py |_config.py |_MODULE_1 | |_ run.py | |_ aux_functions.py | |_ config.py | |_MODULE_2 |_ code.py |_ config.py 它在导入aux_函数中的config时抛

为了有效地构建我的代码,我使用
sys.path+=[path\u to\u MODULE]
将函数导入我的DAG

结构如下:

- MODULE
 |_run.py
 |_aux_functions.py
 |_config.py
|_MODULE_1
|   |_ run.py
|   |_ aux_functions.py
|   |_ config.py
|   
|_MODULE_2
    |_ code.py
    |_ config.py
它在导入
aux_函数中的
config
时抛出错误

aux_函数
run.py
中导入

DAG代码:

from airflow.operators.python_operator import PythonOperator
from airflow                           import DAG

from MODULE_PATHS import PATH_TO_MODULE
import datetime
import sys

sys.path += [ PATH_TO_MODULE ]

from run import run_function

default_args = { "start_date": datetime.datetime( 2018, 8, 20 ) }

with DAG( "run_dag_v1", default_args= default_args, schedule_interval= "0 0 * * *", ) as dag:
    task = PythonOperator( task_id= "run_function", python_callable= run_function, provide_context= True )

task
run.py
导入
aux_函数
,该函数在运行期间从config
导入
设置,但不起作用。显示的错误是:
导入错误:无法导入名称“设置”

# run.py
import aux_functions
.....
def run_function( **kwargs ):
    .....


当代码在shell中执行时,它可以正常工作,没有问题,但是当它通过气流运行时,它会不断显示此导入错误

测试通过:
气流测试运行_dag_v1运行_功能2018-8-21


如果我将
设置
配置
移动到
辅助功能
中,它可以正常工作,但为什么会发生这种情况,我如何避免这种情况?

因此目录结构如下所示:

- MODULE
 |_run.py
 |_aux_functions.py
 |_config.py
|_MODULE_1
|   |_ run.py
|   |_ aux_functions.py
|   |_ config.py
|   
|_MODULE_2
    |_ code.py
    |_ config.py
发生的情况是,一个DAG正在导入
sys.path+=[path\u MODULE\u 1]
,另一个DAG正在导入
sys.path+=[path\u MODULE\u 2]

在气流运行期间,它的配置路径可能错误,因此两个DAG中的任何一个总是出现故障。因此出现导入错误,因为其他配置没有
设置
对象。它们从未同时正常工作

解决方案只是确保在每种情况下,
import-config
都是相对的:
import.config
。通过这样做,气流现在可以在每种情况下识别正确的
config.py

我发现最好的管理方法是从MODULE_PATHS import path_MODULES_DIRECTORY
导入父文件夹路径
,并将
\uuuuuu init\uuuuuuuuupy.py
文件添加到模块中,以及在调用同一模块内的其他文件时仅使用相对导入

因此,新的DAG都具有相同的
sys.path
,所有模块都可以与其模块名称一起导入

MODULES_DIRECTORY
    |
    |_MODULE_1
    |   |_ __init__.py
    |   |_ run.py
    |   |_ aux_functions.py
    |   |_ config.py
    |   
    |_MODULE_2
        |_ __init__.py
        |_ code.py
        |_ config.py





感谢您提供信息丰富的解决方案。在您的示例中,您能否明确说明模块路径导入路径模块目录中的
是什么?我不清楚。
from airflow.operators.python_operator import PythonOperator
from airflow                           import DAG

from MODULE_PATHS import PATH_MODULES_DIRECTORY
import datetime
import sys

sys.path += [ PATH_MODULES_DIRECTORY ]

from MODULE_1.run import run_function

default_args = { "start_date": datetime.datetime( 2018, 8, 20 ) }

with DAG( "run_dag_v1", default_args= default_args, schedule_interval= "0 0 * * *", ) as dag:
    task = PythonOperator( task_id= "run_function", python_callable= run_function, provide_context= True )

task
# run.py
import .aux_functions
.....
def run_function( **kwargs ):
    .....
# aux_functions.py
from .config import settings
.....
# config.py
settings = { ..... }