Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 13, 2022 16:06:49

Olezhka
Зарегистрирован: 2022-12-13
Сообщения: 118
Репутация: +  0  -
Профиль   Отправить e-mail  

Самодельный внешний модуль не выполняет инструкцию "sys.exit()"

Здравствуйте! Требуется консультация знающего специалиста!

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 чтоль идет? Или на что-то еще?
Заранее БОЛЬШО-О-О-ОЕ СПАСИБО за помощь и ответ! 😌

Отредактировано Olezhka (Дек. 13, 2022 16:15:33)

Прикреплённый файлы:
attachment Вопрос.zip (2,7 KБ)

Офлайн

#2 Дек. 13, 2022 16:24:04

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2756
Репутация: +  184  -
Профиль   Отправить e-mail  

Самодельный внешний модуль не выполняет инструкцию "sys.exit()"

 count_proc = 0
 
if count_proc > 1:
    try: # try - это на случай, если прога консольная, без tkinter GUI
        root.destroy()
    except:
        pass
    sys.exit()
Почему он должен вызвать sys.exit()?



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#3 Дек. 13, 2022 17:34:41

Olezhka
Зарегистрирован: 2022-12-13
Сообщения: 118
Репутация: +  0  -
Профиль   Отправить e-mail  

Самодельный внешний модуль не выполняет инструкцию "sys.exit()"

Rodegast
В смысле почему? “if count_proc > 1” - вот почему. И вот почему:
 global count_proc
if proc.name() == proc_name:
    count_proc += 1

Отредактировано Olezhka (Дек. 13, 2022 17:46:38)

Офлайн

#4 Дек. 13, 2022 18:19:17

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

Самодельный внешний модуль не выполняет инструкцию "sys.exit()"

Открываем учебник лутца - читаем главу “Видимость переменных”



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#5 Дек. 13, 2022 19:19:42

Olezhka
Зарегистрирован: 2022-12-13
Сообщения: 118
Репутация: +  0  -
Профиль   Отправить e-mail  

Самодельный внешний модуль не выполняет инструкцию "sys.exit()"

ZerG
Открываем учебник лутца - читаем главу “Видимость переменных”
А можно просто указать на ошибку, если ты ее видишь?

Офлайн

#6 Дек. 13, 2022 19:35:29

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

Самодельный внешний модуль не выполняет инструкцию "sys.exit()"

Да! Ошибка в видимости переменных



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#7 Дек. 13, 2022 19:49:29

Olezhka
Зарегистрирован: 2022-12-13
Сообщения: 118
Репутация: +  0  -
Профиль   Отправить e-mail  

Самодельный внешний модуль не выполняет инструкцию "sys.exit()"

ZerG
Да! Ошибка в видимости переменных
А можно по-человечески сказать, в чем ошибка?

Офлайн

#8 Дек. 13, 2022 19:51:39

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2756
Репутация: +  184  -
Профиль   Отправить e-mail  

Самодельный внешний модуль не выполняет инструкцию "sys.exit()"

> Да! Ошибка в видимости переменных

Нет, ошибка в том что вызов функции autorun происходит после того как был импортирован модуль.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#9 Дек. 13, 2022 20:06:45

Olezhka
Зарегистрирован: 2022-12-13
Сообщения: 118
Репутация: +  0  -
Профиль   Отправить e-mail  

Самодельный внешний модуль не выполняет инструкцию "sys.exit()"

Rodegast
> Да! Ошибка в видимости переменныхНет, ошибка в том что вызов функции autorun происходит после того как был импортирован модуль.
А разве неправильно, что сперва в ШАПКЕ программы импортируются все модули, а уж потом производится вызов функций из этих модулей и работа с их экземплярами?!

Офлайн

#10 Дек. 13, 2022 20:11:41

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2756
Репутация: +  184  -
Профиль   Отправить e-mail  

Самодельный внешний модуль не выполняет инструкцию "sys.exit()"

То что находится внутри модуля выполняется в момент импорта, а потом ты вызываешь функция, но уже поздно.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version