运行从Airflow包导入的python文件,需要airflow实例吗?

问题描述 投票:0回答:1

我遇到了 Airflow 的奇怪导入问题。我想创建一个其他人可以从中导入的模块。我还想对此模块运行单元测试。但是,我注意到,一旦您从气流包中导入任何内容,它就会尝试运行气流。

示例:

# myfile.py
from airflow import DAG

print("Hello world")

然后用

python myfile.py
运行它,结果是:

(.venv) c:\Users\Jarro\Development\airflow-tryout-import>python myfile.py
WARNING:root:OSError while attempting to symlink the latest log directory
Traceback (most recent call last):
  File "c:\Users\Jarro\Development\airflow-tryout-import\myfile.py", line 1, in <module>
    from airflow import DAG
  File "C:\Users\Jarro\Development\airflow-tryout-import\.venv\Lib\site-packages\airflow\__init__.py", line 68, in <module>
    settings.initialize()
  File "C:\Users\Jarro\Development\airflow-tryout-import\.venv\Lib\site-packages\airflow\settings.py", line 559, in initialize
    configure_orm()
  File "C:\Users\Jarro\Development\airflow-tryout-import\.venv\Lib\site-packages\airflow\settings.py", line 237, in configure_orm
    raise AirflowConfigException(
airflow.exceptions.AirflowConfigException: Cannot use relative path: `sqlite:///C:\Users\Jarro/airflow/airflow.db` to connect to sqlite. Please use absolute path such as `sqlite:////tmp/airflow.db`.

除了错误本身之外,我实际上更担心的是,我似乎无法从 Airflow 导入内容,而不会有副作用(例如数据库初始化)。我在这件事上是不是全错了?有没有其他方法可以从 Airflow 导入内容而不产生这些副作用,例如用于打字目的?

python airflow python-import
1个回答
0
投票

发生这种情况是因为 python 中导入的工作方式。 您将从包含

airflow
文件的
__init__
包导入。 如果你检查它,里面有一段代码可以完成所有气流初始化的工作。

__init__py
中的第 67-68 行:
if not os.environ.get("_AIRFLOW__AS_LIBRARY", None):

    settings.initialize()

如果您只想像您所说的那样导入用于打字的内容,您可以设置

_AIRFLOW__AS_LIBRARY
env 变量为任何内容,它不会初始化。

© www.soinside.com 2019 - 2024. All rights reserved.