
n8n-code-python
热门在 n8n Code 节点中编写 Python 代码。当在 n8n 中使用 Python、使用 _input/_json/_node 语法、使用标准库或需要了解 n8n Code 节点中 Python 的限制时使用。当用户明确要求为 n8n Code 节点使用 Python 时使用此技能。注意——95% 的用例推荐使用 JavaScript——仅在用户明确偏好 Python 或任务需要 Python 特有的标准库功能(regex、hashlib、statistics)时才使用 Python。例外——对于 AI 代理可调用的自定义代码工具(@n8n/n8n-nodes-langchain.toolCode)中的 Python,请改用 n8n-code-tool 技能(输入为 _query,返回值必须为字符串)。
Write Python code in n8n Code nodes. Use when writing Python in n8n, using _input/_json/_node syntax, working with standard library, or need to understand Python limitations in n8n Code nodes. Use this skill when the user specifically requests Python for an n8n Code node. Note — JavaScript is recommended for 95% of use cases — only use Python when the user explicitly prefers it or the task requires Python-specific standard library capabilities (regex, hashlib, statistics). EXCEPTION — for Python in the AI-agent-callable Custom Code Tool (@n8n/n8n-nodes-langchain.toolCode), use the n8n-code-tool skill instead (input is _query, return must be a string).
Python Code 节点(Beta)
在 n8n Code 节点中编写 Python 代码的专家指南。
⚠️ 重要提示:优先使用 JavaScript
建议:95% 的用例使用 JavaScript。仅在以下情况使用 Python:
- 需要特定的 Python 标准库函数
- 你更熟悉 Python 语法
- 进行更适合 Python 的数据转换
为什么优先使用 JavaScript:
- 完整的 n8n 辅助函数(
this.helpers.httpRequest等) - Luxon DateTime 库用于高级日期/时间操作
- 无外部库限制
- 更好的 n8n 文档和社区支持
快速开始
# Python Code 节点的基本模板
items = _input.all()
# 处理数据
processed = []
for item in items:
processed.append({
"json": {
**item["json"],
"processed": True,
"timestamp": datetime.now().isoformat()
}
})
return processed
基本规则
- 优先考虑 JavaScript - 仅在必要时使用 Python
- 访问数据:
_input.all()、_input.first()或_input.item - 关键:必须返回
[{"json": {...}}]格式 - 关键:Webhook 数据位于
_json["body"]下(而不是直接_json) - 关键限制:无外部库(没有 requests、pandas、numpy)
- 仅标准库:json、datetime、re、base64、hashlib、urllib.parse、math、random、statistics
模式选择指南
与 JavaScript 相同——根据用例选择:
对所有项目运行一次(推荐 - 默认)
此模式适用于: 95% 的用例
- 工作原理:无论输入数量多少,代码执行 一次
- 数据访问:
_input.all()或_items数组(原生模式) - 最适合:聚合、过滤、批量处理、转换
- 性能:对于多个项目更快(单次执行)
# 示例:计算所有项目的总和
all_items = _input.all()
total = sum(item["json"].get("amount", 0) for item in all_items)
return [{
"json": {
"total": total,
"count": len(all_items),
"average": total / len(all_items) if all_items else 0
}
}]
对每个项目运行一次
此模式适用于: 仅特殊用例
- 工作原理:代码对每个输入项目 分别 执行
- 数据访问:
_input.item或_item(原生模式) - 最适合:项目特定逻辑、独立操作、逐项验证
- 性能:对于大数据集较慢(多次执行)
# 示例:为每个项目添加处理时间戳
item = _input.item
return [{
"json": {
**item["json"],
"processed": True,
"processed_at": datetime.now().isoformat()
}
}]
Python 模式:Beta 与原生
n8n 提供两种 Python 执行模式:
Python(Beta)- 推荐
- 使用:
_input、_json、_node辅助语法 - 最适合:大多数 Python 用例
- 可用辅助函数:
_now、_today、_jmespath() - 导入:
from datetime import datetime
# Python(Beta)示例
items = _input.all()
now = _now # 内置 datetime 对象
return [{
"json": {
"count": len(items),
"timestamp": now.isoformat()
}
}]
Python(原生)(Beta)
- 使用:仅
_items、_item变量 - 无辅助函数:没有
_input、_now等 - 更受限:仅标准 Python
- 何时使用:需要纯 Python 而不需要 n8n 辅助函数时
# Python(原生)示例
processed = []
for item in _items:
processed.append({
"json": {
"id": item["json"].get("id"),
"processed": True
}
})
return processed
建议:使用 Python(Beta) 以获得更好的 n8n 集成。
数据访问模式
通过以下划线为前缀的变量访问输入数据。每个项目是一个形状为 {"json": {...}} 的字典,因此实际字段位于 ["json"] 下。
# 模式 1:_input.all() - 最常用。数组、批量操作、聚合
all_items = _input.all() # 列表,包含 {"json": {...}} 字典
# 模式 2:_input.first() - 非常常用。单个对象、API 响应
data = _input.first()["json"] # 内置安全性优于 all_items[0]
# 模式 3:_input.item - 仅用于“对每个项目运行一次”模式
current = _input.item["json"] # 在“所有项目”模式下为 None/错误
# 模式 4:_node - 引用特定的命名节点
webhook_data = _node["Webhook"]["json"]
http_data = _node["HTTP Request"]["json"]
参见:DATA_ACCESS.md 获取完整指南——六个 _input.all() 配方(过滤、转换、聚合、排序、分组、去重)、_input.first() 和 _input.item 示例、多节点组合、JS 与 Python 变量对照表以及决策树。
关键:Webhook 数据结构
最常见的错误:Webhook 数据嵌套在 ["body"] 下
# ❌ 错误 - 会引发 KeyError
name = _json["name"]
email = _json["email"]
# ✅ 正确 - Webhook 数据位于 ["body"] 下
name = _json["body"]["name"]
email = _json["body"]["email"]
# ✅ 更安全 - 使用 .get() 安全访问
webhook_data = _json.get("body", {})
name = webhook_data.get("name")
原因:Webhook 节点将所有请求数据包装在 body 属性下。这包括 POST 数据、查询参数和 JSON 负载。
参见:DATA_ACCESS.md 获取完整的 Webhook 结构详情
返回格式要求
关键规则:始终返回包含 "json" 键的字典列表
正确的返回格式
# ✅ 单个结果
return [{
"json": {
"field1": value1,
"field2": value2
}
}]
# ✅ 多个结果
return [
{"json": {"id": 1, "data": "first"}},
{"json": {"id": 2, "data": "second"}}
]
# ✅ 列表推导式
transformed = [
{"json": {"id": item["json"]["id"], "processed": True}}
for item in _input.all()
if item["json"].get("valid")
]
return transformed
# ✅ 空结果(当没有数据返回时)
return []
# ✅ 条件返回
if should_process:
return [{"json": processed_data}]
else:
return []
错误的返回格式
# ❌ 错误:没有列表包装的字典
return {
"json": {"field": value}
}
# ❌ 错误:没有 json 包装的列表
return [{"field": value}]
# ❌ 错误:纯字符串
return "processed"
# ❌ 错误:结构不完整
return [{"data": value}] # 应为 {"json": value}
为什么重要:后续节点期望列表格式。格式不正确会导致工作流执行失败。
参见:ERROR_PATTERNS.md #2 获取详细的错误解决方案
关键限制:无外部库
最重要的 Python 限制:默认安装无法导入外部包。
自托管例外:外部包的可用性完全取决于实例的 Python 运行环境配置。如果用户说明其自托管实例的 Python 运行环境中具有特定包,则可以使用它们——不要拒绝。如果不确定,请询问或仅使用标准库编写代码。
❌ 不可用(会引发 ModuleNotFoundError):requests、pandas、numpy、scipy、bs4/BeautifulSoup、lxml。
✅ 可用(仅标准库):json、datetime、re、base64、hashlib、urllib.parse、math、random、statistics。
变通方法
需要 HTTP 请求?
- ✅ 在 Code 节点之前使用 HTTP Request 节点
- ✅ 或者切换到 JavaScript 并使用
this.helpers.httpRequest()(裸$helpers全局变量在任务运行器沙箱中未定义)
需要数据分析(pandas/numpy)?
- ✅ 使用 Python statistics 模块进行基本统计
- ✅ 或者切换到 JavaScript 进行大多数操作
- ✅ 使用列表和字典手动计算
需要网页抓取(BeautifulSoup)?
- ✅ 使用 HTTP Request 节点 + HTML Extract 节点
- ✅ 或者切换到 JavaScript 使用正则表达式/字符串方法
参见:STANDARD_LIBRARY.md 获取完整参考
常见模式概述
基于生产工作流,最有用的 Python 模式是:
- 数据转换 - 使用列表推导式转换所有项目
- 过滤与聚合 - 使用内置函数求和、过滤、计数
- 字符串处理与正则表达式 - 使用
re从文本中提取模式 - 数据验证 - 验证和清理数据,附加错误列表
- 统计分析 - 使用
statistics模块计算均值/中位数/标准差
所有五个模式的即用片段位于 COMMON_PATTERNS.md,以及 10 个完整详细的生成模式(多源聚合、Markdown 解析、JSON 比较、CRM 标准化、字典查找、Top-N 过滤等)。
错误预防 - 前 5 个错误
- 导入外部库(Python 特有)→
import requests会引发ModuleNotFoundError。改用 HTTP Request 节点或 JavaScript。 - 代码为空或缺少 return → 每个路径必须以
return [{"json": ...}]结束。 - 返回格式不正确 → 包装在列表中:
{"json": {...}}变为[{"json": {...}}]。 - 字典访问的 KeyError → 使用
.get():_json.get("user", {}).get("name", "Unknown")。 - Webhook body 嵌套 → 通过
["body"]读取:_json.get("body", {}).get("email", "no-email")。
参见:ERROR_PATTERNS.md 获取完整指南——每个错误都有错误与正确代码、错误消息、嵌套访问修复、一个 AttributeError 额外案例、预防检查清单和快速修复表。
标准库参考
最有用的模块:json(解析/生成)、datetime(日期 + timedelta)、re(正则表达式)、base64(编码/解码)、hashlib(哈希)、urllib.parse(URL 操作)和 statistics(均值/中位数/标准差)。也可用:math、random、collections、itertools、functools。
有关简洁速查表以及每个模块的完整示例,请参见 STANDARD_LIBRARY.md。
最佳实践
1. 始终使用 .get() 进行字典访问
# ✅ 安全:如果字段缺失不会崩溃
value = item["json"].get("field", "default")
# ❌ 危险:如果字段不存在会崩溃
value = item["json"]["field"]
2. 显式处理 None/Null 值
# ✅ 好:如果为 None 则默认为 0
amount = item["json"].get("amount") or 0
# ✅ 好:显式检查 None
text = item["json"].get("text")
if text is None:
text = ""
3. 使用列表推导式进行过滤
# ✅ Pythonic:列表推导式
valid = [item for item in items if item["json"].get("active")]
# ❌ 冗长:手动循环
valid = []
for item in items:
if item["json"].get("active"):
valid.append(item)
4. 返回一致的结构
# ✅ 一致:始终使用带 "json" 键的列表
return [{"json": result}] # 单个结果
return results # 多个结果(已格式化)
return [] # 无结果
5. 使用 print() 语句调试
# 调试语句显示在浏览器控制台中(F12)
items = _input.all()
print(f"Processing {len(items)} items")
print(f"First item: {items[0] if items else 'None'}")
生产环境注意事项
SplitInBatches 循环语义
SplitInBatches 节点有两个输出:
main[0]= 完成 — 在所有批次完成后触发一次main[1]= 每个批次 — 为每个批次触发(循环体)
始终在完成输出后添加一个 Limit 1 节点。
正确的节点引用语法
# ❌ 错误
data = _node['HTTP Request']['json']
# ✅ 正确 - 调用 .first() 然后访问 json
data = _node['HTTP Request'].first()['json']
跨迭代数据在 Python 中不可用
$getWorkflowStaticData('global') 在 Python Beta 模式下可能不可用。如果需要在 SplitInBatches 迭代之间累积数据,请改用 JavaScript Code 节点进行累积逻辑。
何时使用 Python 与 JavaScript
使用 Python 当:
- ✅ 需要
statistics模块进行统计操作 - ✅ 你更熟悉 Python 语法
- ✅ 你的逻辑适合列表推导式
- ✅ 需要特定的标准库函数
使用 JavaScript 当:
- ✅ 需要 HTTP 请求(
this.helpers.httpRequest()) - ✅ 需要高级日期/时间(DateTime/Luxon)
- ✅ 想要更好的 n8n 集成
- ✅ 对于 95% 的用例(推荐)
考虑其他节点当:
- ❌ 简单的字段映射 → 使用 Set 节点
- ❌ 基本过滤 → 使用 Filter 节点
- ❌ 简单条件 → 使用 IF 节点 或 Switch 节点
- ❌ 仅 HTTP 请求 → 使用 HTTP Request 节点
与其他技能的集成
配合使用:
n8n 表达式语法:
- 表达式在其他节点中使用
{{ }}语法 - Code 节点直接使用 Python(无
{{ }}) - 何时使用表达式与代码
n8n MCP 工具专家:
- 如何找到 Code 节点:
search_nodes({query: "code"}) - 获取配置帮助:
get_node({nodeType: "nodes-base.code"}) - 验证代码:
validate_node({nodeType: "nodes-base.code", config: {...}})
n8n 节点配置:
- 模式选择(所有项目与每个项目)
- 语言选择(Python 与 JavaScript)
- 理解属性依赖
n8n 工作流模式:
- 转换步骤中的 Code 节点
- 在模式中何时使用 Python 与 JavaScript
n8n 验证专家:
- 验证 Code 节点配置
- 处理验证错误
- 自动修复常见问题
n8n Code JavaScript:
- 何时使用 JavaScript 替代
- JavaScript 与 Python 功能对比
- 从 Python 迁移到 JavaScript
快速参考检查清单
在部署 Python Code 节点之前,请验证:
- [ ] 已优先考虑 JavaScript - 仅在必要时使用 Python
- [ ] 代码不为空 - 必须有有意义的逻辑
- [ ] 存在 return 语句 - 必须返回字典列表
- [ ] 正确的返回格式 - 每个项目:
{"json": {...}} - [ ] 数据访问正确 - 使用
_input.all()、_input.first()或_input.item - [ ] 无外部导入 - 仅标准库(json、datetime、re 等)
- [ ] 安全的字典访问 - 使用
.get()避免 KeyError - [ ] Webhook 数据 - 如果来自 webhook,通过
["body"]访问 - [ ] 模式选择 - 大多数情况下使用“所有项目”
- [ ] 输出一致 - 所有代码路径返回相同结构
其他资源
相关文件
- DATA_ACCESS.md - 全面的 Python 数据访问模式
- COMMON_PATTERNS.md - 10 个 n8n Python 模式
- ERROR_PATTERNS.md - 前 5 个错误及解决方案
- STANDARD_LIBRARY.md - 完整的标准库参考
n8n 文档
- Code 节点指南:https://docs.n8n.io/code/code-node/
- n8n 中的 Python:https://docs.n8n.io/code/builtin/python-modules/
准备好编写 n8n Code 节点的 Python 代码——但请优先考虑 JavaScript! 为特定需求使用 Python,参考错误模式指南以避免常见错误,并有效利用标准库。





