气流通过bash操作符执行python脚本



我有一个python脚本test2.py来连接到远程服务器并执行该命令。如下所示。这在命令行中有效。

以JSON形式传递参数并以JSON形式获取响应,当在命令行中按如下方式执行时,此操作有效。

python3.6 test2.py  '{"hostname": "<server>", "username":"<test>", "password":"<test1>", "command1":"hostname"}'

我正试图通过气流执行相同的操作

from __future__ import print_function
from airflow.operators import BashOperator
from airflow.models import DAG
from datetime import datetime, timedelta

default_args = {
'owner': 'airflow',
'depends_on_past': False,
'start_date': datetime(2018, 9, 1),
'email_on_failure': False,
'email_on_retry': False,
'schedule_interval': '@daily',
'retries': 1,
'retry_delay': timedelta(seconds=5),
}
dag = DAG(
dag_id='DAG-3',
default_args=default_args,
dagrun_timeout=timedelta(minutes=10)
)
cmd_command = "python3.6 /root/test2.py '{{"hostname": "<server>", "username":"<test>", "password":"<test1>", "command1":"hostname"}}'"

t = BashOperator(
task_id = 'some_id',
bash_command = cmd_command,
dag = dag)

我看到以下与语法有关的错误。?

cmd_command = "python3.6 /root/test2.py '{{"hostname": "<server>", "username":"<test>", "password":"<test1>", "command1":"hostname"}}'"
^
SyntaxError: invalid syntax

你能帮吗

谢谢

JSON使用双引号,但Python将其解释为字符串的开头或结尾。解决此问题的一种方法是转义JSON:中的双引号

cmd_command = "python3.6 /root/test2.py '{"hostname": "<server>", "username":"<test>", "password":"<test1>", "command1":"hostname"}'"

我同意Sergie的观点,你已经重复了"在您的python行中。

cmd_args= r'{"hostname": "<server>", "username":"<test>", "password":"<test1>", "command1":"hostname"}'
cmd_command = f"python3.6 /root/test2.py '{cmd_args}'"

其中

  • r'string'r是Python的RAW字符串,用于关闭规范字符的处理,如\
  • f"string {python_var} "-新python3显式格式化字符串

另一种方法是通过env变量传递参数:

bash_task = BashOperator(
task_id="bash_task",
bash_command="$PYTHON /root/test2.py '$my_params'",
env={"my_params": r'{"hostname": "<server>", "username":"<test>", "password":"<test1>", "command1":"hostname"}', 
"PYTHON": 'python3.6'},
)

最新更新