【问题标题】:Running a python script in virtual environment with node.js pm2使用 node.js pm2 在虚拟环境中运行 python 脚本
【发布时间】:2016-07-05 13:52:28
【问题描述】:

我想引用this question,因为我确信有人会将其标记为重复。

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

手动启动

在原型设计期间,我创建了一个名为“p3env”的虚拟环境。在每个脚本的顶部,我放置了一个 bash 指令:

#!./py3env/bin/python

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

当我说“手动启动”时,我应该清楚我的意思。我的脚本称为“strain_to_db.py”。当我手动启动它时,我通过 ssh 在 shell 上:

./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 时,这可以正常工作。当我尝试使用“命令行参数”样式将其传递给 pm2 时:

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

沮丧

同样的错误。报错总是'can't import pymysql',只安装在虚拟环境中。

我不知道还能去哪里。我有几个要添加到 pm2 执行监视器的脚本,但我似乎无法让其中一个正确启动和运行。

【问题讨论】:

    标签: python node.js ubuntu pm2


    【解决方案1】:

    再环顾四周后,电子邮件顶部的question that I referenced 在其中一个答案中找到了线索,但没有答案。

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

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

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

    【讨论】:

    • 谢谢!这对 virtualenv 非常有用。
    • 这里是PM2 维护者,这个bug 已经修复了吧?我刚刚再次尝试,无论文件扩展名如何,都会按预期考虑解释器选项
    • 不适合我。它说[PM2][ERROR] script not found : /data/python/app/main 其中main.py 将是我的可执行文件。还尝试了相对路径、绝对路径、相同文件夹、手动启动但没有运气。我使用的是 pm2 版本 2.8.0。
    • 关于我们在运行烧瓶应用程序时如何使用它的任何建议? Flask 应用程序不会以带有 .py 扩展名的单个文件开头。而且为烧瓶指定解释器也有点棘手。
    【解决方案2】:

    这篇 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 status 中显示的进程名称

    结果:

    “new”是我的 virtualenv 环境的名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2022-01-11
      • 2019-03-06
      • 1970-01-01
      • 1970-01-01
      • 2020-02-10
      • 1970-01-01
      相关资源
      最近更新 更多