运行 虚拟环境中的 python 脚本 node.js pm2

Running a python script in virtual environment with node.js pm2

我想引用 因为我确定有人会把它标记为重复。

我不是在寻找对 supervisord 的其他参考。我确信它很棒,但是节点 PM2 具有我需要的功能,并且更易于实现和测试。

手动启动

在原型制作过程中,我创建了一个名为 'p3env' 的虚拟环境。在每个脚本的顶部,我放置了一个 bash 指令:

#!./py3env/bin/python

这允许我使用这个特定的 python 环境执行目录中的每个脚本,而无需激活它。它非常方便有用,python 脚本在我手动启动时运行良好。

当我说'start it by hand'时,我应该清楚我的意思。我的脚本名为 'strain_to_db.py'。当我手动启动它时,我在 shell via ssh:

./strain_to_db.py

这让我需要的一切正常工作。

PM2 开始

从相对路径转向绝对路径

为了让 pm2 正常工作,我从:

开始
pm2 start ./strain_to_db.py

指定解释器

显然 pm2 忽略了 python 脚本顶部的指令并尝试使用全局 'python' 执行。没问题,我可以指定解释器:

pm2 start ./strain_to_db.py --interpreter /home/ubuntu/db_if/p3env/bin/python

没有骰子。同样,也许尝试更多绝对路径:

pm2 start /home/ubuntu/db_if/strain_to_db.py --interpreter /home/ubuntu/db_if/p3env/bin/python

运行 脚本作为命令行选项

现在我很沮丧。我尝试另一种策略。我尝试在命令行中使用 运行 python 可执行文件:

/home/ubuntu/db_if/p3env/bin/python /home/ubuntu/db_if/strain_to_db.py

这在不涉及 pm2 时工作正常。当我尝试使用 'command line argument' 样式将其传递给 pm2 时:

pm2 start /home/ubuntu/db_if/p3env/bin/python -- /home/ubuntu/db_if/strain_to_db.py

沮丧

同样的错误。一直报错'can't import pymysql',只安装在虚拟环境下。

我不知道还能用这个做什么。我有几个脚本想添加到 pm2 执行监视器,但我似乎无法启动其中一个并且 运行 正确。

仔细查看后,电子邮件顶部的 在其中一个答案中提供了线索,但不是答案。

当文件以 '.py' 结尾时,pm2 会调用 'python'... 无论如何。我相信 pm2 中有一个配置文件,您可以修改它来更改此行为。我只是从脚本中删除了“.py”并指定了解释器:

pm2 start ./strain_to_db --interpreter ./py3env/bin/python

完美运行。当我使用pm2创建启动脚本时,我会使用绝对路径。感谢所有正在寻找的人,我希望这对以后的人有所帮助。

这篇 Medium 文章为我解决了这个问题。

https://medium.com/@gokhang1327/deploying-flask-app-with-pm2-on-ubuntu-server-18-04-992dfd808079

虚拟环境中 运行 一个 python 脚本的命令:

pm2 start app.py --name flask-app --interpreter=python3

--name 它是可选的,这是在 pm2 状态中显示的进程名称

结果:

"new" 是我的 virtualenv 环境的名称。

这个问题有点晚了,但对于任何带着一双新眼睛来到这里的人来说,我发现如果你激活虚拟环境,例如。 source venv/Scripts/activate 然后通过 pm2 启动你的脚本,例如。 pm2 start main.py --name migration,它会自动使用你激活的环境。