【问题标题】:Python script within a Pipenv as a windows service with NSSMPipenv 中的 Python 脚本作为具有 NSSM 的 Windows 服务
【发布时间】:2019-04-20 10:06:03
【问题描述】:

使用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 安装 ServiceName "C:\Users\Username\AppData\Local\Programs\Python\Python36\Scripts\pipenv.exe" “运行 python main.py”
  2. nssm 设置服务名称 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 没有被用于以与通过命令行运行时相同的方式运行脚本。

【问题讨论】:

    标签: python pipenv nssm


    【解决方案1】:

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

    pipenv --venv
    

    service.bat

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 同样的问题...但是你的解决方案并不理想
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-02
      • 2023-03-14
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 2014-07-17
      相关资源
      最近更新 更多