Как я могу исправить мой "самоудаление" .exe от самого раннего удаления?

Для тестирования и личного подтверждения концепции у меня есть файл.exe, который выводит только простую строку и затем вызывает системную паузу (буквально system("pause") в C++).

У меня есть простой скрипт на Python, который я тестирую на виртуальной машине Windows XP, которая выполняет следующие операции при сбое:

subprocess.call(r'echo Nothing special. > c:\blank.txt', shell=True)
subprocess.call(r'type pause.exe > c:\blank.txt:ads.exe', shell=True)
subprocess.call(r'start c:\blank.txt:ads.exe', shell=True)
subprocess.call(r'del c:\blank.txt', shell=True)

Очевидно, что все эти команды отлично работают в одиночку в командной строке, почему они не работают нормально при вызове через Python?

Я получаю это всплывающее сообщение об ошибке:

blank.txt: ads.exe столкнулся с проблемой и должен быть закрыт. Приносим свои извинения за неудобства.

Если бы вы были в середине чего-то, информация, над которой вы работали, может быть потеряна.

Файл действительно удален. Кажется, что системная пауза просто сжимается командой delete, когда я ожидаю, что.exe появится, подождите, пока я нажму enter, и затем скрипт продолжит работу и удалит файл.

3 ответа

Решение

Учитывая эти симптомы, я понимаю, что вы можете безопасно удалить исполняемый файл только в этом конкретном параметре (Windows XP, возможно, на определенном уровне исправлений, когда исполняемый файл из альтернативного потока) после завершения инициализации этого исполняемого файла. Если вы удаляете исполняемый файл во время загрузки, программа вылетает.

Когда вы вводите эти команды в командной строке, между выполнением start c:\blank.txt:ads.exe а также del c:\blank.txt, давая программе достаточно времени для завершения загрузки. Когда вы запускаете их из скрипта, интервал между ними намного короче (start ветвится новый процесс, и инициализация новой программы происходит асинхронно). Есть расы между инициализацией и удалением; какой из них выиграет, зависит от того, как скоро будет выполнено удаление.

Попробуйте поэкспериментировать с задержкой перед удалением файла:

import subprocess, time
subprocess.call(r'echo Nothing special. > c:\blank.txt', shell=True)
subprocess.call(r'type pause.exe > c:\blank.txt:ads.exe', shell=True)
subprocess.call(r'start c:\blank.txt:ads.exe', shell=True)
time.sleep(42)  # 42 seconds is overkill, but the delay isn't predictable
subprocess.call(r'del c:\blank.txt', shell=True)

Что происходит, что каждый subprocess.call(..., shell=True) немедленно возвращается, потому что они просто говорят оболочке выполнить команду. В командной строке вызов exe для запуска с использованием start Команда все равно немедленно вернется, даже если exe не завершен. start немедленно вернулся и нужно сказать ждать:

subprocess.call(r'echo Nothing special. > c:\blank.txt', shell=True)
subprocess.call(r'type pause.exe > c:\blank.txt:ads.exe', shell=True)
subprocess.call(r'start /wait c:\blank.txt:ads.exe', shell=True)
subprocess.call(r'del c:\blank.txt', shell=True)

Оболочка окон start Команда запустит программу в новой оболочке, а затем просто продолжит. Ждать его завершения использования call:

subprocess.call(r'call c:\blank.txt:ads.exe', shell=True)
Другие вопросы по тегам