Je ne peux pas tuer le sous-processus négligé en utilisant Python sur le Windows

J'ai un script Python, qui fonctionne tout au long de la journée, vérifiant le temps tous les 60 secondes pour qu'il puisse courir / Terminer des tâches /Autres scénarios python/ À certaines périodes de la journée.

Ce script fonctionne presque tout normalement. Les tâches sont lancées au bon moment et ouvertes dans une nouvelle fenêtre.
cmd

, Donc, le script principal peut continuer à fonctionner et à sélectionner du temps. Le seul problème est que cela ne va tout simplement pas tuer les tâches.


import os
import time
import signal
import subprocess
import ctypes


freq = 60 # sampling frequency in seconds

while True:
print 'Sampling time...'
now = int/time.time///

#initialize the task.. lets say 8:30am
if / time.strftime/"%H:%M", time.localtime/now// == '08:30'/:
# The following method is used so python opens another cmd window and keeps original script running and sampling time
pro = subprocess.Popen/["start", "cmd", "/k", "python python-task.py"], shell=True/

# kill process attempts.. lets say 11:40am
if / time.strftime/"%H:%M", time.localtime/now// == '11:40'/:
pro.kill// #not working - nothing happens

pro.terminate// #not working - nothing happens

os.kill/pro.pid, signal.SIGINT/ #not working - windows error 5 access denied

# Kill the process using ctypes - not working - nothing happens
ctypes.windll.kernel32.TerminateProcess/int/pro._handle/, -1/

# Kill process using windows taskkill - nothing happens
os.popen/'TASKKILL /PID '+str/pro.pid/+' /F'/

time.sleep/freq/


Note importante:

Script de tâches
python-task.py

Il sera effectué sans fin. C'est pourquoi j'ai besoin de pouvoir être capable de "force" Tuez-le à un moment donné, jusqu'à ce que cela fonctionne.

Toute preuve? Qu'est-ce que je fais mal? Comment le tuer?
Invité:

Francis

Confirmation de:

Tu tues shell, Qui donne naissance à votre sous-processus et non votre sous-processus.

EDIT: de la documentation:

La seule fois où vous devez spécifier shell=True sur le Windows, - C'est à ce moment que la commande que vous voulez effectuer est intégrée à shell /par exemple, dir ou copy/. Tu n'as pas besoin shell=True Pour commencer batch file ou fichier exécutable de la console.

Avertissement

Diffuser shell=True Il peut poser une menace de sécurité en combinaison avec des données d'entrée peu fiables. Pour plus de détails, voir Avertissement dans la section Arguments fréquemment utilisées.

Par conséquent, au lieu de transmettre une ligne, envoyez chaque argument séparément dans la liste et évitez d'utiliser shell. Vous voulez probablement utiliser le même fichier exécutable pour un enfant que pour le parent, c'est donc généralement quelque chose comme:


pro = subprocess.Popen/[sys.executable, "python-task.py"]/

Pour répondre aux questions, connectez-vous ou registre