Найти - Пользователи
Полная версия: Питон медленный. И еще выполняет то, о чем я его не просил!
Начало » Python для новичков » Питон медленный. И еще выполняет то, о чем я его не просил!
1 2 3
py.user.next
Olezhka
Батник запускает интерпретатор, состоящий из двух процессов - “py.exe” и “python.exe”. Вопрос - а как мне теперь запретить запуск копий программы (мне надо!)
Для запрета копий программы обычно делают так: программа создаёт свой файл в директории и записывает туда номер своего процесса; когда запускается вторая копия программы, она проверяет, есть ли этот файл в этой директории и не запускается, если он есть; а когда программа завершает работу, она удаляет этот свой файл. Это самое простое, что можно реализовать. Не надо проверять никакие процессы.
Olezhka
py.user.next
Для запрета копий программы обычно делают так: программа создаёт свой файл в директории и записывает туда номер своего процесса; когда запускается вторая копия программы, она проверяет, есть ли этот файл в этой директории и не запускается, если он есть; а когда программа завершает работу, она удаляет этот свой файл. Это самое простое, что можно реализовать. Не надо проверять никакие процессы.
Да, спасибо за совет! Я такой совет уже нагугливал! Но там в комментах этому советчику ответили, что у данного способа есть весомый недостаток. Если программа не завершит нормально свою работу (сбой, скачок напряжения, внештатное выключение всей системы), этот файл никто не удалит. Он там так и останется лежать. И после этого программа не запустится вообще.
P.S. Ты мне, пожалуйста, расскажи про “Nutika”. Ты с ней знаком?
P.P.S. Неужели нет никакой функции ни в одном модуле, запрещавшего бы запуск копий программы? Неужели до сих пор никто не сделал и до сих пор такую простейшую нужду приходится делать через ж*пу такими костылями?!
xam1816
Olezhka
А виртуальная машина не на процессоре чтоль выполняется? На USB-контроллере чтоль выполняется? Или на южном мосте?
На блоке питания, там пока по проводам дойдет это все до процессора, получается долго. Тема из разряда - умный не спросит, дурак не поймет. Ключевое слово у тебя - выполняется виртуальная машина - это по теме твоей что питон медленный.И в exe по всей видимости pyinstaller запихивает эту машину, чтобы разернуть на другом пк, где нет установленного python.exe от того и размер большой. А для антивирусников такой exe - сатанинское отродие, потому что виртуальной машине нужно как-то понять как преобразовать свой байт-код, в байт-код процессора, а для этого нужно залезть в системные папочки.
py.user.next
Olezhka
Но там в комментах этому советчику ответили, что у данного способа есть весомый недостаток. Если программа не завершит нормально свою работу (сбой, скачок напряжения, внештатное выключение всей системы), этот файл никто не удалит.
Если в файле записать номер процесса, который его и создаёт, то этот номер процесса и работающие процессы можно сравнить. При работающем процессе python.exe в файле будет записан номер этого процесса. Совпадение нового процесса со старым процессом, который и создал этот файл, имеет очень маленькую вероятность. Если файл создал процесс с именем python.exe с номером 12345, то после сбоя этого процесса не будет. Если будет python.exe, то он будет с другим номером.

Olezhka
P.S. Ты мне, пожалуйста, расскажи про “Nutika”. Ты с ней знаком?
По вопросам на форуме знаком. Проблем с ней, с nuitka, немало обычно.
Что и как паковать, писал здесь.
Olezhka
xam1816
И в exe по всей видимости pyinstaller запихивает эту машину, чтобы развернуть на другом пк, где нет установленного python.exe
Нихрена подобного! Нет, может, конечно, у меня две пары ног, но я когда скомпилировал пробный “екзешник” “pyinstaller”ом и попытался, как ты выражаешься, развернуть этот “экзешник” на своем другом ПК, на котором ВООБЩЕ не установлен “Питон”, при запуске экзешника тут же вылезло окошко с ошибкой, что не найдены внешние модули, используемые в программе. Как только “Питон” на вторую машину установил, ошибка пропала.
Olezhka
py.user.next
Не надо проверять никакие процессы
Как это не надо?! Либо я до конца не понял, либо… Вот смотри! Рисую схему!
1) Я программа на “python.exe”. Я запустился.
2) Я проверяю наличие файла “три_два_раз.txt” в директории “Х:\Ren\Znaet\Gde”
3) Файл не обнаружен! Я смотрю свой “ПИД”. PID = 0021. Я записываю в файл “Х:\Ren\Znaet\Gde\три_два_раз.txt” число 0021.

Теперь пытается запуститься дубликат той же программы на том же “python.exe”.
1) Я дубликат. Я запустился!
2) Я проверяю наличие файла “три_два_раз.txt” в директории “Х:\Ren\Znaet\Gde”
3) Файл есть!
4) Я считываю из него число 0021.
5) Я получаю список ВСЕХ ПРОЦЕССОВ модулем “psutil”. Циклом “for” я перебираю ВСЕ ПРОЦЕССЫ на предмет совпадения “ПИД”. Ага! Один процесс с PID = 0021 обнаружен!
6) Все! Свертываю удочки и sys.exit()!

Я правильно логику понял? Если да, то как же ты тогда говоришь, что “Не надо проверять никакие процессы”?
py.user.next
Olezhka
Я правильно логику понял? Если да, то как же ты тогда говоришь, что “Не надо проверять никакие процессы”?
Если тебе не нужна устойчивость к падениям системы, то тебе не нужно анализировать процессы. Достаточно только файл проверить на наличие и создать при запуске и удалить при завершении и всё.

Если тебе нужна устойчивость к падениям системы, то тебе нужно дополнительно инфу про процессы анализировать. Соответственно, без файла этого ты никак это не сделаешь, потому что программе B надо помнить как-то о том, что было падение системы и оно было именно в тот момент, когда программа A ещё работала. Понимаешь, падение системы может быть и при незапущенной программе A. Если падение системы было при незапущенной программе A, тогда не надо это падение учитывать при запуске программы B. Соответственно, как программа A во время своей работы может понять, что произошло падение системы? Никак. Но когда программа B запускается, она может проверить, было ли падение по тому, что 1) прошлый запуск программы A был, 2) что прошлый запуск программы A не завершился правильно. А как программа B поймёт, что прошлый запуск программы A был? Только по какому-то признаку, по каким-то следам. И вот этот файл - это вот этот след.

Если файл есть, то программа B видит, что либо программа A работает, либо программа A работала и упала. Тогда программа B проверяет, работает ли программа A в данный момент. Для этого программа B открывает файл и читает его. А в файле программа A записала свой номер процесса. Тогда если этот номер процесса вообще есть в системе и, если он есть в системе, процесс с этим номером содержит имя python.exe, и командная строка процесса ведёт к программе A, тогда программа B видит, что программа A работает, и тогда программа B завершается. Но если программа B не видит файла; либо программа B видит файл и номера процесса из файла нет в системе; либо номер процесса файла есть в системе, но имя этого процесса с этим номером не python.exe; либо там имя процесса python.exe, но командная строка ведёт не к тому исходному файлу; - тогда программа B перезаписывает файл своим номером процесса и продолжает работать. Теперь программа B становится программой A.

Эта штука даёт имена процессов
https://psutil.readthedocs.io/en/latest/#psutil.process_iter
Эта штука даёт командную строку процесса
https://psutil.readthedocs.io/en/latest/#psutil.Process.cmdline

После падения системы и перезагрузки вряд ли ты даже номер того же процесса найдёшь потом. Но если ты его находишь, потому что программа B у тебя запускается не сразу, а через несколько часов, например, когда система поработала долгое время, то есть вторая проверка, является ли этот номер процессом python.exe. Но он может являться этим процессом, если у тебя много всяких скриптов на питоне в системе. Но тогда ты обращаешься уже к командной строке процесса и по ней уже видно, тот это скрипт или не тот это скрипт. Каждое из этих действий имеет вероятность 0.5, а все они вместе имеют вероятность 0.5 * 0.5 * 0.5 = 0.5 ^ 3 = 0.125. То есть то, что ты дойдёшь вообще до проверки командной строки, составляет 12.5%. Это о-о-очень редкая фигня. Оно прямо на проверке номера процесса будет завершаться практически всегда.
Olezhka
py.user.next
Спасибо.
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