gpt4 book ai didi

python - os.system 可以启动但不能终止 Python 进程

转载 作者:太空宇宙 更新时间:2023-11-04 08:35:44 27 4
gpt4 key购买 nike

我无法使用 os.system() 阻止 python 脚本运行,但我可以使用 os.system() 使其运行。当我在终端上运行相同的命令来终止进程时,它起作用了。

我的 web_plants.py 脚本中有这段代码片段,可以使用 Flask 将其部署在 html 中:

@app.route("/auto/water/<toggle>")
def auto_water(toggle):
running = False
if toggle == "ON":
templateData = template(text = "Auto Watering On")
for process in psutil.process_iter():
try:
if process.cmdline()[1] == 'auto_water.py':
templateData = template(text = "Already running")
running = True
except:
pass
if not running:
os.system("python auto_water.py")
else:
templateData = template(text = "Auto Watering Off")
os.system("pkill -f water.py")

return render_template('main.html', **templateData)

if __name__ == "__main__":
app.run(host='0.0.0.0', port=80, debug=True)

我有一个 water.py 脚本,其中包含我 html 页面上按钮的 auto_water 函数。但该功能运行良好,所以我想这不是问题。

def auto_water(pump_pin = 38):
init_output(pump_pin)
print("Reading Soil Humidity values from ADS1115")

try:
while True:
m = adc.read_adc(0, gain=GAIN)
print('Moisture Level:{0:>6}'.format(m))
time.sleep(1)
if m>23000:
#GPIO.output(pump_pin, GPIO.LOW)
print "relay on"
else:
#GPIO.output(pump_pin, GPIO.HIGH)
print "relay off"
except KeyboardInterrupt:
GPIO.cleanup()
except Exception as e:
print (e)

我有这个 auto_water.py 文件,它导入 water 并调用 auto_water() 函数来运行它。使用此文件的目的是当我单击“停止”按钮时能够在文件运行时将其杀死。

import water

#From the water.py script, call the auto_water function and run it as a process

if __name__ == "__main__":
water.auto_water()

脚本一直在运行,我必须从终端使用 sudo pkill -f water.py 终止它,以使其停止。但同样的命令在 web_plants.py 文件上不起作用,当我按下“停止”按钮时,我曾用它来停止它。但是,当我杀死它时,网页会注册它并显示文本“Auto Watering OFF”,如 web_plants.py 文件中的以下行所示:

templateData = template(text="Auto Watering Off")
os.system("pkill -f water.py")

最佳答案

你能用 os.kill() 代替吗?

import os
import signal

os.kill(pid, signal.SIGTERM)

如果您没有可用的 pid,请使用 subprocess.check_output 获取它。 (如果您使用的是 Python 3.5+,请改用 subprocess.run。)

import os
import signal
import subprocess

def get_water_pid():
return int(subprocess.check_output(['pgrep', '-f', 'water.py']).strip())

def kill_water_process():
pid = get_water_pid()
os.kill(pid, signal.SIGTERM)

关于python - os.system 可以启动但不能终止 Python 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49270069/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com