我正在尝试学习一些新的东西,也许这是基本的问题,但无法找到解决方案在谷歌上。
我有Python脚本,需要在后台无限运行的Windows服务,更容易管理(停止,启动,删除和安装服务)。因为我计划从react应用程序控制此服务。
的数据
下面是我的python模拟代码:
import threading ,time,sys
def start() :
while True :
time.sleep(1)
open(r'E:\test.log', 'w').write('heelo\n')
threading.Thread(target=start).start()
字符串
由于我有无限循环,当服务启动时,它会超时,因为py脚本没有返回退出状态。
这是我的powershell脚本来管理服务。
param(
[string]$arg1
)
# Define your service name, display name, and description
$serviceName = "nmsCore"
$displayName = "NMS CORE SERVICE"
$description = "This is a sample service."
# Define the path to your Python executable and the script
$pythonExecutable = "E:\Python_Venv\env310_1\Scripts\python.exe"
$scriptPath = "E:\Working\nmscore\v1\pycode\nmscore_service.py"
$arg1_value = $arg1
# Switch statement to handle different commands
switch ($arg1_value) {
"install" {
# Create the service
New-Service -Name $serviceName -BinaryPathName "$pythonExecutable $scriptPath" -DisplayName $displayName -Description $description
Write-Output "Service installed."
}
"start" {
# Start the service
Start-Service -Name $serviceName
Write-Output "Service started."
}
"stop" {
# Stop the service
Stop-Service -Name $serviceName
Write-Output "Service stopped."
}
"delete" {
# Delete the service
sc.exe delete $serviceName
Write-Output "Service deleted."
}
"restart" {
Stop-Service -Name $serviceName
Start-Service -Name $serviceName
Write-Output "Service updated."
}
"reinstall" {
sc.exe delete $serviceName
New-Service -Name $serviceName -BinaryPathName "$pythonExecutable $scriptPath" -DisplayName $displayName -Description $description
Write-Output "Service re-installed."
}
default {
Write-Output "Invalid command."
}
}
型
如何在后台启动Python代码作为服务?如果还有更好的办法,谢谢指教
1条答案
按热度按时间isr3a4wc1#
你必须将Python与作为后台服务运行它的操作系统分开。正如您所注意到的,每个操作系统都以自己的方式完成它,因此例如,与Linux及其
systemd
相比,Windows对其运行的应用程序具有不同的期望。正确的方法是将代码库分成两部分:第一个将满足操作系统的要求,并处理它期望遵循的协议(这就是您面临的超时的来源:协议被违反,超时是OS如何响应)。另一个第二部分是执行工作的部分-启动后台
Thread
并执行您希望脚本执行的任何操作(请注意,它将在具有不同权限和访问权限的不同用户下启动,例如,您必须在触摸某些文件时考虑到它)。P.S.处理它提供的
Windows
和Services
子系统并不是真的很容易。如果你真的需要实施和支持它,请三思。