我编写了一个程序,该程序通过subprocess
库从自身调用另一个程序,然后通过sys.exit()
终止自身。
但是不是那么简单。应该有一个问题清单。 (请注意,它与脚本本身无关,而与通过pyinstaller创建的该脚本的应用程序有关)
APPDATA\Local\test
中运行os.remove(o)
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
首先,您要问很多彼此不相关的问题。其次,我不确定您要在这里实现什么目标,但是我将为您分别提供一个简短的答案。
使用PyInstaller创建的应用程序(带有-F标志)将部署两个进程。一种是提取可执行文件的内容并在执行代码后清除,另一种是程序本身。另外,您正在使用subprocess
调用可执行文件,因此它将变成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)
这样做时,我使两个程序的名称不同,以便正确终止进程。