Невозможно принудительно завершить программу в python - PullRequest
2 голосов
/ 28 октября 2019

Я написал программу, которая вызывает другую программу из себя через библиотеку subprocess, а затем завершает себя через sys.exit().

Но это не так просто. Там должен быть список вопросов. (обратите внимание, что речь идет не о самом скрипте, а о применении этого скрипта, созданного через pyinstaller)

  1. Когда я захожу в диспетчер задач, во вкладке сведений я вижу там 4 теста.exe, 2 из них работают в текущей папке, остальные 2 находятся в APPDATA\Local\test
  2. os.remove(o) не выполняется
  3. path + f'\\{k}.txt' сохраняются только в APPDATA\Local\test, иf'{k}test.txt' только для текущей папки

Видимо, программа вообще не запускается из appdata, но это не так, потому что в диспетчере задач она отображается даже дважды. В чем причина такого поведения? И как это исправить?

UPD: я позаботился о том, чтобы файлы сохранялись только в упадте, записывая os.chdir(path) после else:. Но первое выполнение все еще не может быть завершено.

import sys
import os
import time


path = os.path.dirname(os.getenv('APPDATA')) + '\\Local\\test'
try:
    os.mkdir(path)
except OSError:
    pass
if not os.path.isfile(path + '\\test.exe'):
    with open(path + '\\info.txt', 'w', encoding='utf-8') as f:
        f.write(sys.argv[0])
    subprocess.call(['copy', sys.argv[0], path + '\\test.exe'], shell=True)
    subprocess.call(path + '\\test.exe', shell=True)
    sys.exit()
else:
    with open(path + '\\info.txt', 'r', encoding='utf-8') as f:
        o = f.readline()
        if os.path.isfile(o):
            try:
                os.remove(o)
            except:
                pass

k = 0
while True:
    time.sleep(5)
    with open(path + f'\\{k}.txt', 'w', encoding='utf-8') as f:
        f.write('test message 1')
    with open(f'{k}test.txt', 'w', encoding='utf-8') as f:
        f.write('test message 2')
    k += 1

Ответы [ 2 ]

1 голос
/ 01 ноября 2019

Во-первых, вы задаете много вопросов, которые не имеют отношения друг к другу. Во-вторых, я не уверен, чего вы пытаетесь достичь, но я дам вам краткий ответ для каждого.

  1. Приложения, созданные с помощью PyInstaller (с флагом -F)развертывает два процесса. Одним из них является извлечение содержимого исполняемого файла и очистка после выполненного кода, а вторым - сама ваша программа. И, кроме того, вы вызываете исполняемый файл с subprocess, чтобы он стал 4-мя процессами.

  2. После создания вашего исполняемого файла sys.argv[0] будет равен пути самого исполняемого файла. ,Таким образом, вы не можете вызвать os.remove() для удаления самого исполняемого файла.

  3. Я не уверен насчет вопроса, но os.path.dirname(os.getenv('APPDATA')) будет переведен в путь AppData пользователя, ноf'{k}test.txt' будет преобразован в текущий путь к исполняемому файлу, где расположен исполняемый файл.

0 голосов
/ 03 ноября 2019

Я решил проблему, убил процесс с помощью taskkill. В результате код после else выглядит следующим образом:

os.chdir(path)
with open(path + '\\info.txt', 'r', encoding='utf-8') as f:
    o = f.readline()
    if os.path.isfile(o):
        subprocess.call(['TASKKILL', '/IM', 'test.exe', '/F'], shell=True)
        os.remove(o)

При этом я изменил имена двух программ, чтобы правильно завершить процесс.

...