无法在python中强制终止程序

问题描述 投票:2回答:2

我编写了一个程序,该程序通过subprocess库从自身调用另一个程序,然后通过sys.exit()终止自身。

但是不是那么简单。应该有一个问题清单。 (请注意,它与脚本本身无关,而与通过pyinstaller创建的该脚本的应用程序有关)

  1. 当我进入任务管理器时,在详细信息选项卡中,我看到有4个test.exe,其中2个正在当前文件夹中运行,另外2个在APPDATA\Local\test中运行
  2. 未执行os.remove(o)
  3. [path + f'\\{k}.txt'仅保存在APPDATA\Local\test中,并且f'{k}test.txt'仅保存到当前文件夹中

显然,该程序根本不是从appdata启动的,但事实并非如此,因为在任务管理器中甚至显示了两次。这种行为的原因是什么?以及如何解决?

UPD:我确保仅在upadte中保存文件,在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
python python-3.x pyinstaller exit
2个回答
1
投票

首先,您要问很多彼此不相关的问题。其次,我不确定您要在这里实现什么目标,但是我将为您分别提供一个简短的答案。

  1. 使用PyInstaller创建的应用程序(带有-F标志)将部署两个进程。一种是提取可执行文件的内容并在执行代码后清除,另一种是程序本身。另外,您正在使用subprocess调用可执行文件,因此它将变成4个进程。

  2. 创建可执行文件后,sys.argv[0]将等于可执行文件本身的路径。因此,您无法调用os.remove()来删除可执行文件本身。

  3. 我不确定这个问题,但是os.path.dirname(os.getenv('APPDATA'))将被转换为用户的AppData路径,但是f'{k}test.txt'将被转换为可执行文件所在的当前可执行路径。


0
投票

我解决了这个问题,通过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)

这样做时,我使两个程序的名称不同,以便正确终止进程。

© www.soinside.com 2019 - 2024. All rights reserved.