无法在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创建的此脚本的应用程序)
APPDATA\Local\test
os.remove(o)
未执行path+f'\{k}.txt'
仅保存在APPDATA\Local\test
中,而f'{k}test.txt'
仅保存到当前文件夹中其他:
之后写入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
首先,你问了很多彼此不相关的问题。第二,我不确定你们在这里想要实现什么,但我会给你们一个简单的答案
子进程调用可执行文件,因此它将变成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'
?你确定这样行吗?