Найти - Пользователи
Полная версия: Самодельный внешний модуль не выполняет инструкцию "sys.exit()"
Начало » Python для новичков » Самодельный внешний модуль не выполняет инструкцию "sys.exit()"
1 2
Olezhka
Здравствуйте! Требуется консультация знающего специалиста!

Python 3.11.0
Windows 11 x64

Я написал внешний модуль “autorun.py”. Вот его код:
 import winreg
from winreg import *
import psutil
from tkinter import messagebox
import sys
error = 0
proc_path = ''
proc_name = ''
count_proc = 0
def autorun(no_dub = 0):
    global error
    global proc_path
    global proc_name
    global count_proc
   
    autorun = winreg.OpenKeyEx(HKEY_CURRENT_USER, r'Software\Microsoft\Windows\CurrentVersion\Run', 0, KEY_ALL_ACCESS)
    proc = psutil.Process()
    try:
        proc_path = proc.exe()
    except:
        error = 1
    try:
        proc_name = proc.name()
    except:
        error = 2
   
    if no_dub == 1:
        for proc in psutil.process_iter():
            if proc.name() == proc_name:
                count_proc += 1
    elif no_dub == 0:
        pass
    else:
        messagebox.showinfo("Autorun_error", '"dub" param unrecognized!')
    return error, no_dub, count_proc, proc_name
if proc_name != 'pythonw.exe':                
    if proc_path != '':
        winreg.SetValueEx(autorun, proc_name, 0, REG_SZ, proc_path)
    else:
        if error == 1:
            messagebox.showinfo("Autorun_error", "Can't detect EXE path")
        elif error == 2:
            messagebox.showinfo("Autorun_error", "Can't detect EXE name")
if count_proc > 1:
    try: # try - это на случай, если прога консольная, без tkinter GUI
        root.destroy()
    except:
        pass
    sys.exit()
Я вызываю его из основной программы “Processes.py” вот так:
 from autorun import autorun
autorun(no_dub = 1)
Данный модуль “autorun.py” добавляет текущий процесс программы в автозагрузку и, если аргумент “no_dub = 1” (по умолчанию он равен “0”), модуль должен выполнять инструкции “root.destroy()” и “sys.exit()”, запрещающие запуск дубликатов программы. Но сам модуль почему-то эти инструкции завершения работы не выполняет. Но функция модуля возвращает 4 аргумента (error, no_dub, count_proc, proc_name):

error - код ошибки
no_dub - параметр no_dub
count_proc - количество найденных одноименных процессов
proc_name - имя своего процесса

Запускал я программу “Processes.py”, скомпилированную в “ехе” “pyinstaller”ом.
Чтобы выйти из положения, мне пришлось тогда из основной программы “Processes.py” вызывать этот внешний модуль вот с такой проверкой:
 if autorun(no_dub = 1)[2] > 2:
    root.destroy()
    sys.exit()
> 2 - это потому что в “Taskmanager” 2 процесса на одну программу приходится почему-то.
Так все работает. Но остаются вопросы!
1) А как все же заставить именно внешний модуль “autorun.py” выполнять эти функции выхода? Почему он их не выполняет?
2) А почему при запуске скомпилированного в “ехе” “Processes.py” у меня в процессах повисает сразу 2 экземпляра “Processes.ехе”? Дочерних окон у меня в программе не используется. Как так? Там получается, что отдельный процесс на tkinter GUI чтоль идет? Или на что-то еще?
Заранее БОЛЬШО-О-О-ОЕ СПАСИБО за помощь и ответ! 😌
Rodegast
 count_proc = 0
 
if count_proc > 1:
    try: # try - это на случай, если прога консольная, без tkinter GUI
        root.destroy()
    except:
        pass
    sys.exit()
Почему он должен вызвать sys.exit()?
Olezhka
Rodegast
В смысле почему? “if count_proc > 1” - вот почему. И вот почему:
 global count_proc
if proc.name() == proc_name:
    count_proc += 1
ZerG
Открываем учебник лутца - читаем главу “Видимость переменных”
Olezhka
ZerG
Открываем учебник лутца - читаем главу “Видимость переменных”
А можно просто указать на ошибку, если ты ее видишь?
ZerG
Да! Ошибка в видимости переменных
Olezhka
ZerG
Да! Ошибка в видимости переменных
А можно по-человечески сказать, в чем ошибка?
Rodegast
> Да! Ошибка в видимости переменных

Нет, ошибка в том что вызов функции autorun происходит после того как был импортирован модуль.
Olezhka
Rodegast
> Да! Ошибка в видимости переменныхНет, ошибка в том что вызов функции autorun происходит после того как был импортирован модуль.
А разве неправильно, что сперва в ШАПКЕ программы импортируются все модули, а уж потом производится вызов функций из этих модулей и работа с их экземплярами?!
Rodegast
То что находится внутри модуля выполняется в момент импорта, а потом ты вызываешь функция, но уже поздно.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB