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

时间:2019-04-20 10:06:04

标签: 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 \ Username \ AppData \ Local \ Programs \ Python \ Python36 \ Scripts \ pipenv.exe 运行python main.py

即使脚本导入了安装在pipenv中的软件包(例如 flask ),它也会成功启动脚本。然后,我使用以下方法创建了NSSM服务:

  1. nssm.exe安装服务名“ C:\ Users \ Username \ AppData \ Local \ Programs \ Python \ Python36 \ Scripts \ pipenv.exe” “运行python main.py”
  2. nssm设置ServiceName AppDirectory “ C:\ pipenvfolder \ foo”

每隔2秒,它将在c:\ temp中创建一个目录。一切都很好。但是现在我希望导入一个已安装的Pipenv软件包,即,在pipenv中安装的 flask 软件包。因此,我在上面的测试脚本中添加了“导入烧瓶”。

然后,我将NSSM设置为具有错误日志,并检查为什么它无法启动,并且无法导入烧瓶模块:

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

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

2 个答案:

答案 0 :(得分:0)

我怀疑这将不会得到任何答案,但是如果其他人也有同样的问题。 我通过使用pyinstaller制作exe解决了这个问题。这是相当快捷和容易的。然后,我将.exe作为要运行的可执行文件传递给NSSM。

答案 1 :(得分:0)

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

pipenv --venv

service.bat

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

使用nssm安装服务,该服务会调用此批处理文件。

相关问题