Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将带有服务员服务器的Python Flask设置为Windows服务时无法运行_Python_Flask_Service_Window - Fatal编程技术网

将带有服务员服务器的Python Flask设置为Windows服务时无法运行

将带有服务员服务器的Python Flask设置为Windows服务时无法运行,python,flask,service,window,Python,Flask,Service,Window,我用Flask构建了一个Python应用程序,并使用waiteress服务器运行 该应用程序使用本地.csv文件作为输入数据 通过命令行运行可以很好地运行。(即pythonwebserver.py),我可以加载csv来读取数据,上传(覆盖)csv文件 但当我将其添加为窗口服务(使用nssm或窗口资源工具包)时,我的应用程序可以运行,但csv文件只能由JS加载,不能由python加载 这意味着,在服务模式下,如果我使用js加载csv,就可以了,但当加载或上载文件(使用python脚本)时,它会返回

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

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

通过命令行运行可以很好地运行。(即pythonwebserver.py),我可以加载csv来读取数据,上传(覆盖)csv文件

但当我将其添加为窗口服务(使用nssm或窗口资源工具包)时,我的应用程序可以运行,但csv文件只能由JS加载,不能由python加载

这意味着,在服务模式下,如果我使用js加载csv,就可以了,但当加载或上载文件(使用python脚本)时,它会返回“内部服务器错误”

我的问题是,通过命令行运行和添加为Windows的服务有何不同?如何使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'
我还添加了女服务员Web服务器作为服务,包括:

> -(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>
-(nssm)nssm.exe安装MyService。然后添加python路径和执行的python文件。
>-(窗口ResKit)instsrv.exe LNG c:\ResKit\srvany.exe。然后在Regedit中添加“Parameter”键,添加指向的“Application”字符串
在这两种情况下,它都返回“内部服务器错误”

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

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


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

具体来说:

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

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

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

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

HKCU注册条目
如果您的应用程序使用注册表,并使用HKEY_CURRENT_用户树,则当它作为服务运行时,情况可能会有所不同。(HKEY_当前的_机器可能相同)

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

如果要更改到其他文件夹,则
\images
版本可能无法工作

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

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

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

通常web服务器会在服务器的某个位置写入日志文件


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

非常感谢。你的回答让我相信这是关于启动文件夹的。的确如此。将启动文件夹设置为源代码文件夹解决了此问题。(nssm的startup directory参数)再次感谢您,您救了我一天。@LeoLucas如果答案正确,您应该接受它。