Здравствуйте! Требуется консультация знающего специалиста!
Я написал внешний модуль "autorun.py". Вот его код:
Я вызываю его из основной программы "Processes.py" вот так:
Данный модуль "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" вызывать этот внешний модуль вот с такой проверкой:
> 2 - это потому что в "Taskmanager" 2 процесса на одну программу приходится почему-то.
Так все работает. Но остаются вопросы!
1) А как все же заставить именно внешний модуль "autorun.py" выполнять эти функции выхода? Почему он их не выполняет?
2) А почему при запуске скомпилированного в "ехе" "Processes.py" у меня в процессах повисает сразу 2 экземпляра "Processes.ехе"? Дочерних окон у меня в программе не используется. Как так? Там получается, что отдельный процесс на tkinter GUI чтоль идет? Или на что-то еще?
Заранее БОЛЬШО-О-О-ОЕ СПАСИБО за помощь и ответ!
Я написал внешний модуль "autorun.py". Вот его код:
Python:
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" вот так:
Python:
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" вызывать этот внешний модуль вот с такой проверкой:
Python:
if autorun(no_dub = 1)[2] > 2:
root.destroy()
sys.exit()
> 2 - это потому что в "Taskmanager" 2 процесса на одну программу приходится почему-то.
Так все работает. Но остаются вопросы!
1) А как все же заставить именно внешний модуль "autorun.py" выполнять эти функции выхода? Почему он их не выполняет?
2) А почему при запуске скомпилированного в "ехе" "Processes.py" у меня в процессах повисает сразу 2 экземпляра "Processes.ехе"? Дочерних окон у меня в программе не используется. Как так? Там получается, что отдельный процесс на tkinter GUI чтоль идет? Или на что-то еще?
Заранее БОЛЬШО-О-О-ОЕ СПАСИБО за помощь и ответ!
Вложения
Последнее редактирование: