Python 开发者必看:如何在 n8n Code 节点中运行 Python 脚本与处理数据?

2026-01-25 37 0

还在为数据清洗头秃?n8n 的 Code 节点才是 Python 玩家的正确打开方式

笔者在 N8N大学 的社区里,每天都能看到大量 Python 开发者在问同一个问题:我想在 n8n 里写点逻辑,能不能不用 JavaScript?答案是肯定的,而且非常爽。n8n 的 Code 节点原生支持 Python,这意味着你可以用最熟悉的 Pandas、NumPy 或者简单的脚本来处理 JSON 数据。

Python 开发者必看:如何在 n8n Code 节点中运行 Python 脚本与处理数据?

很多刚接触 n8n 的开发者,往往会被 JavaScript 的语法劝退,或者在复杂的节点组合中迷失方向。其实,只要你会写 Python,你就拥有了 n8n 中最强大的数据处理能力。今天,笔者就带你手把手把 Python 脚本塞进 n8n 的工作流里,彻底告别手动复制粘贴。

第一步:寻找并配置 Python 的藏身之处

默认情况下,n8n 的 Code 节点运行在 JavaScript 环境。要切换到 Python,操作非常简单,但新手容易眼瞎找不到。

  1. 在你的工作流中添加一个 Code 节点。
  2. 点击节点进入编辑模式,在右侧的 Language 参数下拉框中,将默认的 JavaScript 切换为 Python
  3. 此时,你会看到代码编辑器变成了 Python 的语法结构。

这里有一个关键点:n8n 的 Python 运行环境是沙盒化的。这意味着你不能像在本地终端那样直接 pip install 任意库。不过,n8n 预装了一些常用库,关于这一点,我们稍后在“避坑指南”里细说。

第二步:搞懂 n8n 的数据是如何传进 Python 的

这是最核心的环节。在 n8n 中,数据是以 JSON 格式在节点间流动的。在 Python 脚本中,你需要通过 `n8n` 这个全局模块来获取输入数据和定义输出数据。

标准的代码结构长这样:

import json
from n8n import Input, Output

# 获取上一个节点传来的数据
items = Input.items()

# 这里的 items 是一个列表,包含所有输入的 JSON 对象
for item in items:
    # 获取 JSON 中的某个字段
    user_name = item.json.get('name')
    
    # 进行你的 Python 逻辑处理
    processed_name = user_name.upper()
    
    # 将结果放入 output
    item.json['processed_name'] = processed_name
    Output.append(item)

注意看,我们通过 Input.items() 拿到数据,处理完后用 Output.append(item) 把数据交还给 n8n 的工作流。这就是俗称的“进水口”和“出水口”。

第三步:实战演练——用 Python 过滤 API 返回的脏数据

假设你调用了一个 API,返回了一堆用户数据,但里面有很多无效用户(status 为 inactive)。用 JavaScript 节点写 filter 可能要写一行箭头函数,但用 Python 就像写诗一样优雅。

场景: 过滤出所有活跃用户,并计算他们名字的长度。

from n8n import Input, Output

items = Input.items()
active_users = []

for item in items:
    payload = item.json
    
    # 假设原始数据在 payload['body'] 里
    if payload.get('status') == 'active':
        # 新增一个字段
        payload['name_length'] = len(payload.get('name', ''))
        active_users.append(payload)

# 批量写入输出
for user in active_users:
    new_item = {'json': user}
    Output.append(new_item)

运行这个工作流,你会得到一个只包含活跃用户,并且每个用户都多了 name_length 字段的新数据集。这就是 Python 处理数据的魅力。

第四步:如何使用 Pandas 进行暴力清洗

如果你需要做复杂的数据分析或清洗,比如合并表格、计算平均值,手动写循环太累了。只要你的 n8n 实例环境支持(或者你使用了 Docker 自定义镜像),直接引入 Pandas 是可以的。

import pandas as pd
from n8n import Input, Output
import json

# 将 n8n 的输入数据转换为 DataFrame
items = Input.items()
data = [item.json for item in items]
df = pd.DataFrame(data)

# Pandas 操作:比如填充空值
df.fillna(value={'age': 0, 'score': 0}, inplace=True)

# 转换回 n8n 格式
for record in df.to_dict('records'):
    new_item = {'json': record}
    Output.append(new_item)

这招对于处理 Excel 导出的数据或者数据库查询结果特别好用,直接降维打击。

避坑指南:这些报错能让你少走 3 小时弯路

在 N8N大学 的实战经验里,Python 节点有两大深坑,新手必踩。

1. 缺包报错:ModuleNotFoundError

n8n 的官方 Docker 镜像默认没有安装 Pandas 或 Requests。如果你直接 import pandas,会直接报错。

解决方案: 如果你是自托管(Self-hosted),你需要重新构建 Docker 镜像,或者在启动命令中挂载卷来安装依赖。对于 N8N大学 的建议是:如果是简单的逻辑,尽量用原生 Python;如果必须用库,建议去 GitHub 找找有没有大神封装好的“包含 Pandas 的 n8n 镜像”。

2. 数据类型陷阱

Python 和 n8n 的 JSON 交互非常依赖类型。比如在 Python 里,None 会被转成 JSON 的 null。如果你在 Python 里做了一个判断 if item.json.get('price'):,而价格恰好是 0,在 Python 里这是 False,导致数据被过滤掉了!

解决方案: 显式地判断 is None,或者使用 .get('price', 0) 提供默认值。

FAQ:Python 开发者最关心的 3 个问题

Q1: 我能在 Code 节点的 Python 脚本里发送 HTTP 请求吗?

A: 理论上可以,但不推荐。虽然你可以 import requests(如果环境支持),但这破坏了 n8n 的可视化逻辑。建议使用专门的 HTTP Request 节点来发送请求,然后把结果传给 Code 节点处理。这样出错了容易排查。

Q2: Python 脚本的执行有超时限制吗?

A: 有的。默认通常是 30 到 60 秒。如果你的 Python 脚本需要处理大量数据或进行复杂的计算,建议分批处理,不要在一个 Code 节点里跑完所有逻辑。

Q3: 我能用 Python 脚本操作 n8n 的全局变量吗?

A: 不可以直接访问。n8n 的 $execution 等变量在 Python 环境中不可见。你需要通过 Input 把这些变量作为参数传进来,或者使用 N8N大学 之前讲过的 Set 节点提前定义好。

总结与资源

在 n8n 中使用 Python,本质上是在低代码平台中嵌入了一段高代码的“瑞士军刀”。它弥补了 n8n 在复杂数据计算上的短板,又保留了 n8n 连接万物的优势。

如果你是 Python 开发者,不要再纠结于 JavaScript 的语法了,直接切到 Python 模式,把你熟悉的库和逻辑搬进去,这才是自动化的终极形态。

推荐阅读:

  • N8N大学官网 - 更多进阶教程
  • n8n 官方文档 - Code 节点 Python API 参考

相关文章

安全加固:限制 n8n Code 节点访问文件系统与内网 IP (Sandbox 配置)
超越 SQLite:为什么生产环境必须连接 PostgreSQL 以及如何配置?
元数据获取:使用 $workflow.id 和 $execution.id 生成带追踪参数的回调链接
高并发架构:配置 Redis + n8n Worker 模式实现分布式任务处理
解决 OOM 崩溃:优化 n8n 大数据量处理时的内存占用 (Memory Leak) 技巧
多入口触发:如何让一个工作流同时支持 GET/POST 甚至多个不同路径的 Webhook?

发布评论