Как я могу исправить мой «самоудаление» .exe от самого раннего удаления? - PullRequest
2 голосов
/ 20 мая 2011

Для тестирования и личного подтверждения концепции у меня есть файл .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 ]

1 голос
/ 21 мая 2011

Учитывая эти симптомы, я понимаю, что вы можете безопасно удалить исполняемый файл только в этом конкретном параметре (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)
1 голос
/ 21 мая 2011

Что происходит, так это то, что каждый 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)
0 голосов
/ 21 мая 2011

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

subprocess.call(r'call c:\blank.txt:ads.exe', shell=True)
...