使用NSSM将Pipenv中的Python脚本作为Windows服务

4

使用如何在Windows中将Python脚本作为服务运行?,我可以让一个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 run python main.py

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

  1. nssm.exe install ServiceName "C:\Users\Username\AppData\Local\Programs\Python\Python36\Scripts\pipenv.exe" "run python main.py"
  2. nssm set ServiceName AppDirectory "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.从正确的目录中调用它可以指定 pipenv.因此,我无法确定为什么 pipenv 没有被用来运行脚本,就像通过命令行运行时一样。
2个回答

3
创建一个批处理文件,调用你的虚拟环境。 获取虚拟环境路径:
pipenv --venv

service.bat

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

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

0

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


同样的问题... 但是您的解决方案并不理想。 - guilhermecgs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接