无法在python中强制终止程序

2024-04-19 16:09:30 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

  1. 当我进入任务管理器的details选项卡时,我看到4个测试.exe,其中2个在当前文件夹中运行,另2个在APPDATA\Local\test
  2. os.remove(o)未执行
  3. path + f'\\{k}.txt'只保存在APPDATA\Local\test,而{}只保存到当前文件夹

显然,程序根本不是从appdata开始的,但事实并非如此,因为在任务管理器中,它会显示两次。这种行为的原因是什么?怎么解决呢?在

UPD:我确保文件只保存在upadte中,在else:之后写入os.chdir(path)。但第一次处决仍然无法完成。在

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

Tags: pathtest程序txtoslocalaswith
2条回答

我通过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)

在这样做的时候,为了正确地终止进程,我将两个程序的名称改为不同的名称。在

首先,你问了很多彼此无关的问题。第二,我不知道你们想在这里实现什么,但我将给你们一个简短的答案。在

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

  2. 创建可执行文件后,sys.argv[0]将等于可执行文件本身的路径。{t>因此不能调用cd3}。

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

相关问题 更多 >