繁体   English   中英

使用Waitress服务器的Python Flask在将其作为Windows服务时无法运行

[英]Python Flask with Waitress server cannot run, when making it as a Windows service

我用Flask构建了一个Python应用程序并使用Waitress服务器运行。

该应用程序使用本地.csv文件作为输入数据。

它可以在命令行运行时运行良好。 (即python webserver.py),我可以加载csv来读取数据,上传(覆盖)csv文件。

但是当我将它添加为窗口服务(使用nssm或Window Resource Kit)时,我的应用程序可以运行,但csv文件只能由JS加载,而不能由python加载。

这意味着,在服务模式下,如果我使用js加载csv,没关系,但是当加载或上传文件时(使用python脚本)它返回“内部服务器错误”。

我的问题是,如何通过命令行运行并添加Window的服务不同? 如何将python脚本作为服务使用csv文件?

任何帮助表示赞赏。 非常感谢。

这是上传代码。

@app.route('/uploadss', methods = ['GET', 'POST'])
def upload():
    import os
    print(request.files['file'])
    if request.method=='POST':
        file = request.files['file']
        filenames = ['temperature.csv','inlet_clean_info.csv','log_data.csv','medium-term-temperature.csv']
        if file.filename in filenames:
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], file.filename))
            return 'file uploaded successfully'
        else:
            return 'filename is not acceptable'

我已经将服务员网络服务器添加为服务:

> -(nssm) nssm.exe install MyService. Then add python path and the executed python file.
> -(Window ResKit) instsrv.exe LNG c:\reskit\srvany.exe. Then add "Parameter" key in Regedit, add "Application" String to point to <python path> <executed path>

在这两种情况下,它都会返回“内部服务器错误”

这是错误消息,即返回的响应

“ 500内部服务器错误

内部服务器错误

服务器遇到内部错误,无法完成您的请求。 服务器过载或应用程序中存在错误。

将应用程序作为服务运行时的主要区别在于环境。

有些事情具体:

服务运行的用户是哪个。
当您从命令行启动它时,它可能作为您的用户帐户运行。 您的用户帐户可能具有Windows系统帐户的不同权限。 这往往会导致访问文件的问题,例如,打开HTTP服务器的端口。 可能存在其他与权限相关的问题。

环境变量,包括PATH。
当你在命令shell中时,windows有一个PATH变量,告诉它在哪里查找可执行文件。 因此,如果您键入python它会在当前文件夹中查找python.exe ,然后搜索PATH变量,直到找到python.exe

您还可以定义其他可以定义的环境变量,例如TMP(临时文件夹)等。

当它作为服务运行时,它通常在不同的用户上下文中运行,这将具有不同的环境变量,%TMP%和PATH。 所以可能发生的一件事是它正在尝试运行python.exe但是服务用户的路径上没有python.exe

HKCU注册表入口
如果您的应用使用注册表并使用HKEY_CURRENT_USER树,则当它作为服务运行时可能会有所不同。 (HKEY_CURRENT_MACHINE可能相同)。

应用程序启动的文件夹
从命令行运行它时,通常在当前文件夹中启动它。 这意味着可以使用相对路径(例如.\\images )而不是绝对路径( c:\\website\\images )。

如果您要更改为其他文件夹,则.\\images版本可能无法正常工作。

当程序作为服务运行时,它通常似乎从C:\\Windows\\System32

因此,您可以调查使用绝对路径是否有效。 或者您可以调查是否有指定启动文件夹的方法。

要检查的另一件事(可能是第一件事) - 查找日志文件

通常,Web服务器会在某处的服务器上写入日志文件。

500错误将发送给用户,但是会有更详细的错误写入日志。 因此,找到该日志文件应该在哪里并检查它。 (它可能不在它应该的位置,这可能与服务运行的用户相关的权限有关)。 如果它存在,它可能有助于追踪特定问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM