无法在python中强制程序终止

无法在python中强制程序终止,python,python-3.x,pyinstaller,exit,Python,Python 3.x,Pyinstaller,Exit,我编写了一个程序,它通过子进程库从自身调用另一个程序,然后通过sys.exit()终止自身 但并不是那么简单。应该有一个问题清单。(注意,这将不是关于脚本本身,而是关于通过pyinstaller创建的此脚本的应用程序) 当我转到任务管理器时,在“详细信息”选项卡中,我看到有4个test.exe,其中2个在当前文件夹中运行,另外2个在APPDATA\Local\test os.remove(o)未执行 path+f'\{k}.txt'仅保存在APPDATA\Local\test中,而f'{k}te

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

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

  • 当我转到任务管理器时,在“详细信息”选项卡中,我看到有4个test.exe,其中2个在当前文件夹中运行,另外2个在
    APPDATA\Local\test
  • os.remove(o)
    未执行
  • path+f'\{k}.txt'
    仅保存在
    APPDATA\Local\test
    中,而
    f'{k}test.txt'
    仅保存到当前文件夹中
  • 显然,程序根本不是从appdata开始的,但事实并非如此,因为在任务管理器中,它甚至会显示两次。这种行为的原因是什么?如何修复它

    UPD:我已经确保文件只保存在upadte中,在
    其他:
    之后写入
    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
    

    首先,你问了很多彼此不相关的问题。第二,我不确定你们在这里想要实现什么,但我会给你们一个简单的答案

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

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

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


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

    在这样做的过程中,为了正确终止进程,我将两个程序的名称设置为不同。

    info.txt的内容是绝对路径吗?是的,
    sys.argv[0]
    首先单击图标启动应用程序时返回绝对路径。。。您说创建了4个进程。好啊但是,我通过sys.exit()终止两个程序中的一个。为什么我还有4个进程?这变得很奇怪,因为你要以嵌套方式执行
    test.exe
    ,你的脚本会一遍又一遍地调用自己,不管你调用
    sys.exit
    。我仍然无法获取您试图在此处执行的操作。我希望可执行文件在当前文件夹中运行,在AppData中创建并运行其副本,并通过sys.exit()终止自身。然后,副本将删除此帮助程序可执行文件,并开始在AppData(相对于自身的当前文件夹)中创建包含测试消息的文件。你是说一个程序不会因为另一个程序启动而终止吗?那么,我需要在代码中做什么更改才能使它像我上面描述的那样工作呢?问题是,你要如何告诉副本删除启动它的第一个进程?您需要检查可执行文件是否从所需路径运行。如果是,则做出决定。然后您可以安全地退出代码。也就是说,您提供而不是
    非os.path.isfile(path+'\\test.exe')
    来放置
    非sys.argv[0]==path+'test.exe'
    ?你确定这样行吗?