Pipenv 中的 Python 脚本作为带有 NSSM 的 Windows 服务

标签 python pipenv nssm

使用How do you run a Python script as a service in Windows?我可以获得一个 python 脚本作为服务运行。使用我编写的以下代码对其进行了测试:

import os
from time import sleep
from random import *
# import flask    <-- This line breaks it only when run from NSSM

count = 0
while True:
    num = randint(1, 10000)
    count+=1
    os.mkdir("C:\\temp\\" + str(count) + '_' + str(num))
    sleep(2)

我通过首先运行以下命令来测试要放入 NSSM 的可执行文件和参数:

  1. cd C:\pipenvfolder\foo
  2. C:\Users\用户名\AppData\Local\Programs\Python\Python36\Scripts\pipenv.exe 运行 python main.py

它会成功启动脚本,即使它导入了 pipelinev 中安装的软件包(例如 flask)。然后我创建了一个 NSSM 服务:

  1. nssm.exe install ServiceName“C:\Users\用户名\AppData\Local\Programs\Python\Python36\Scripts\pipenv.exe” “运行python main.py”
  2. nssm 设置服务名称应用程序目录 “C:\pipenvfolder\foo”

每 2 秒它就会在 c:\temp 中创建一个目录。一切都很好。但是现在我希望导入已安装的 Pipenv 软件包之一,即安装在 Pipenv 中的 flask 软件包。所以我在上面的测试脚本中添加了“import Flask”。

然后,我将 NSSM 设置为有错误日志,并检查了它无法启动的原因,以及无法导入 flask 模块:

Traceback (most recent call last):
  File "main.py", line 7, in <module>
    import flask
ModuleNotFoundError: No module named 'flask'

nssm 服务必须在正确的应用目录中启动,否则它将找不到 main.py。从正确的目录调用它是指定 pipelinev 的内容。因此,我无法弄清楚为什么不使用 pipelinev 来以与通过命令行运行时相同的方式运行脚本。

最佳答案

创建一个调用您的虚拟环境的批处理文件。 获取virtualenv路径:

pipenv --venv

服务.bat

call path/to/.virtualenv/Scripts/activate.bat
call python main.py

使用调用此批处理文件的 nssm 安装服务。

关于Pipenv 中的 Python 脚本作为带有 NSSM 的 Windows 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55772409/

相关文章:

Python:Python WX GUI 应用程序从控制台窃取焦点

python - sys.executable 是如何确定解释器路径的?

node.js - 使用 NSSM 制作 node.js 服务

powershell - 在Powershell中使用NSSM安装服务

python - 如何使按钮图像拉伸(stretch)、透明、宽度高度完全缩放适合?

python - 平均日期数组计算

python - PySpark 将数组内的结构字段转换为字符串

python-3.x - pipfile 中的自定义部分

python - 如何使用 Pipenv 卸载多个软件包?

nssm - 如何修复启动 nssm 服务器时的 SERVICE_PAUSED 错误