在n8n中的code节点虽然可以运行python代码,但它似乎只是运行的一个沙河环境,并不能调用外部库。
但对于一些复杂的逻辑,我们可能难以用自带节点完成,那么我们就需要能完整调用外部库的环境。
我经常探索,找到了一个方法,就是通过使用 execute command 节点,直接运行python文件。并且为了docker容器升级后,python安装的第三方库能够不消失,我们需要用virtualenv创建一个python环境挂载到本地的目录中。
n8n 的安装
我是使用docker安装的n8n,
docker run -d --restart=unless-stopped \
--name n8n \
-p 8888:5678 \
-v ~/.n8n:/home/node/.n8n \
-v ~/docker/n8n:/data \
-e TZ=Asia/Shanghai \
-e N8N_TIMEZONE=Asia/Shanghai \
-e GENERIC_TIMEZONE=Asia/Shanghai \
-e N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true \
-e N8N_SECURE_COOKIE=false \
--user node \
docker.n8n.io/n8nio/n8n
其中
-v ~/docker/n8n:/data
你需要将~/docker/n8n
换成你自己本地的一个目录,这将容器内的/data
目录会永久化挂在你本地的目录中,这是后面我们要用virtualenv安装python的位置。
另外-p 8888:5678
中 8888 端口是可以修改为外部访问的端口。
以root用户进入容器安装Python
安装好后,我们需要打开终端,运行下面命令,以root用户进入容器:
docker exec -u root -it n8n sh
以 root 用户进入容器,主要是它才有权限安装 virtualenv。
然后我们再执行下面命令安装 virtualenv:
apk add py3-virtualenv
有了virtualenv,我们才可以再安装一个虚拟的python环境。
创建python虚拟环境
创建虚拟环境,放在挂载的文件夹下,这样可以永久化保存,不会因为升级了容器版本而没有了:
python3 -m venv /data/venv
执行完后,它会在容器内的 /data/venv
文件夹下创建一个 python虚拟环境。
再将这个文件夹权限给 node 用户,这样才可以在 n8n 节点上安装包:
chown -R node:node /data/venv
然后,我们退出容器:
exit
在 execute command 节点中安装第三方包
我们在n8n 中创建一个 execute command
节点:
在节点中运行安装第三方包的命令:
这里以安装 pandas 为例,你可以安装任意的第三方包:
/data/venv/bin/pip3 install pandas
这里的 /data/venv/bin/pip3
就是前面我们安装的并持久化在本地的虚拟环境的 pip 命令。
执行成功后,它就在虚拟环境中安装好了。
在 execute command 节点中执行外部python文件
当你安装好你所需要的所有第三方包后。
我们就可以调用你容器内挂载在本地的 python 文件。
比如,我前面安装的 n8n 是将容器内的 /data
文件夹挂载在本地的~/docker/n8n
目录下。
我只需要将我python文件放在``~/docker/n8n`文件夹或其子文件夹下,容器内就可以访问到。
/data/venv/bin/python3 /data/xxx.py
这样,我们就可以间接实现运行python文件了。并且容器升级后,前面安装的python第三方包也持久化保留了下来。