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 = { ..... }