Programma termina automaticamente

di il
5 risposte

Programma termina automaticamente

Salve, ho creato questo script python che mi permette di accendere, spegnere e settare il volume del microfono.
In particolare ogni volta che premo una hotkey (ad esempio: ctrl+alt) viene cambiato lo stato del microfono, quindi se il microfono
è spento viene acceso e settato il volume, mentre se è accesso viene spento.
Tutto sembra funzionare, l'unico problema è che dopo qualche ora che lo script è in attesa della hotkey da tastiera, sia che l'ultima azione sia stata quella di accendere il microfono sia che sia stata quella di spegnere il microfono, il programma termina automaticamente ( lo vedo dal task manager, infatti il processo python.exe dopo qualche ora si auto elimina) e quindi mi tocca dover rilanciare lo script da terminale. Quale può essere il problema?
import keyboard
from win10toast import ToastNotifier
import os
import subprocess


def change_status_mic(status_mic, toaster, vol, name_mic):
    if status_mic:
        status_mic = False
        execute_command(status_mic, toaster, vol, name_mic)
    elif not status_mic:
        status_mic = True
        execute_command(status_mic, toaster, vol, name_mic)
    return status_mic


def execute_command(status_mic, toaster, vol, name_mic):
    if status_mic:
        turn_on_mic(name_mic)
        set_volume_at_volume()
        toaster.show_toast("MicTool", "Mic ON\nVolume set to " + vol, "C:\\Windows\\MicLock\\resources\\microphone.ico",
                           duration=3) //crea notifica su windwos

    elif not status_mic:
        turn_off_mic(name_mic)
        toaster.show_toast("MicTool", "Mic OFF", "C:\\Windows\\MicLock\\resources\\microphone.ico", duration=3) //crea notifica su windows


def turn_on_mic(name_mic):
   os.system("C:\\Windows\\MicLock\\resources\\SoundVolumeView.exe /unmute" + " " + name_mic)


def turn_off_mic(name_mic):
    os.system("cd c:\\windows\\system32 && taskkill /f /IM nircmdc.exe > nul 2> nul")
    os.system("C:\\Windows\\MicLock\\resources\\SoundVolumeView.exe /mute" + " " + name_mic)


def set_volume_at_volume():
    subprocess.run(["C:\\windows\\system32\\cscript.exe", "C:\\Windows\\MicLock\\start_loop_mic.vbs"]) //lo script vbs esegue nircmdc.exe in modo silent


def read_file():
    with open("C:\\Windows\\MicLock\\Volume.txt", 'r') as file:
        vol = file.readline(4)
        name_mic = file.readline(20)
        hotkey = file.readline(15)
        msec = file.readline(10)
    file.close()
    return vol.strip('\n'), name_mic.strip('\n'), hotkey.strip('\n'), msec.strip('\n')


def create_bat_loop_mic(str_vol_extended, msec):
    txt_loop_mic = "C:\\windows\\MicLock\\resources\\nircmdc.exe loop 172800 " + msec + " setsysvolume " + str_vol_extended + " default_record"
    with open("C:\\Windows\\MicLock\\loop_mic.bat", 'w') as file:
        file.write(txt_loop_mic)
    file.close()


def main():
    vol, name_mic, hotkey, msec = read_file()
    vol_extended = int((65535 * int(vol)) / 100)
    str_vol_extended = str(vol_extended)
    create_bat_loop_mic(str_vol_extended, msec)
    toaster = ToastNotifier()
    status_mic = False
    execute_command(status_mic, toaster, vol, name_mic)
    while True:
        if keyboard.is_pressed(hotkey):
            status_mic = change_status_mic(status_mic, toaster, vol, name_mic)


if __name__ == "__main__":
    main()

5 Risposte

  • Re: Programma termina automaticamente

    Salve,
    presupponendo che lei stia operando su Windows, credo faccia al caso suo "Utilità di pianificazione" (Task Schedurel) di Windows.
    Sito Ufficiale
  • Re: Programma termina automaticamente

    Conosco il task scheduler, per adesso avevo impostato l'avvio automatico dello script dal regedit, ma il problema che il programma si chiude automocaticamente dopo qualche ora lo fa anche se avvio manualmente lo script dal cmd.
  • Re: Programma termina automaticamente

    Hai provato a forzare qualche azione (che non cambia le impostazioni) dopo un'ora di inattività?
  • Re: Programma termina automaticamente

    Non ho fatto nulla,ho solo lasciato lo script in esecuzione, inoltre ora ho provato a fare il run dall'ide e dopo due ore il programma è terminato con exit code -1073741819 (0xC0000005)
  • Re: Programma termina automaticamente

    Un'altra soluzione che mi viene in mente, dato che magari c'è qualche package che ha qualche problema in esecuzioni a lungo termine, sarebbe un mini script che esegue all'infinito il tuo script principale.

    Per farmi capire:
    un loop (while True) che con subprocess richiami il tuo script e attanda che finisca prima di iterare nuovamente.

    In questo modo quando si interrompe in maniera anomala dovrebbe rieseguirlo...
Devi accedere o registrarti per scrivere nel forum
5 risposte