Python exe不会删除自己

时间:2017-02-02 14:13:27

标签: python py2exe pyinstaller

我试图创建一个python脚本来转换成只删除自己的exe。当我将它作为.py文件运行时,它可以工作。代码是这样的:

import os
os.remove(os.getcwd + "\\test.py")

我在Windows工作,这就是为什么我使用\\而且该文件显然名为test.py.但是当我将它转换为exe文件时(我已经尝试过使用py2exe和pyinstaller)它会给我访问拒绝错误。有谁知道如何解决这个问题?

PS:是的,如果您要问,我已将名称更改为test.exe。

1 个答案:

答案 0 :(得分:0)

这不会那么简单。 1)当您运行脚本时,实际上是执行语句的python.exe,脚本文件(test.py)是免费的。这样python.exe就可以删除脚本了。 2)当您将脚本转换为exe时,它是exe文件本身正在执行,这意味着文件是“忙”,或换句话说 - 由进程使用,并且它不能被删除。

找到一种方法来启动另一个进程,该进程将在您退出当前进程后删除该文件。

编辑(示例代码):


import sys
import ctypes
import platform
import subprocess

def execute(command, async=False): """ if async=False Executes a shell command and waits until termination and
returns process exit code if async=True Executes a shell command without waiting for its termination and returns subprocess.Popen object On Windows, does not create a console window. """ if async: call = subprocess.Popen else: call = subprocess.call

if platform.system() == 'Windows':
    # the following CREATE_NO_WINDOW flag runs the process without 
    # a console window
    # it is ignored if the application is not a console application
    return call(command, creationflags=0x08000000)
else:
    return call(command)

def main():

ctypes.windll.user32.MessageBoxA(0, __file__, 'Show path', 0) ctypes.windll.user32.MessageBoxA(0, sys.executable, 'sys.executable', 0) with open(r'D:\delete_me.py', 'w') as f: f.write('import os\n') f.write('import time\n') f.write('time.sleep(2)\n') f.write('os.remove(r"{}")'.format(sys.executable)) execute(r'C:\Python27\python.exe D:\delete_me.py', async=True)
if platform.system() == 'Windows': # the following CREATE_NO_WINDOW flag runs the process without # a console window # it is ignored if the application is not a console application return call(command, creationflags=0x08000000) else: return call(command)

ctypes.windll.user32.MessageBoxA(0, __file__, 'Show path', 0) ctypes.windll.user32.MessageBoxA(0, sys.executable, 'sys.executable', 0) with open(r'D:\delete_me.py', 'w') as f: f.write('import os\n') f.write('import time\n') f.write('time.sleep(2)\n') f.write('os.remove(r"{}")'.format(sys.executable)) execute(r'C:\Python27\python.exe D:\delete_me.py', async=True)

这是用`pyinstaller.exe --onefile --windowed D:\ self_delete.py

编译的

执行函数是我们用来在Linux和Windows上执行调用的东西,我只是复制了它。这就是平台检查的原因。 如果你不能执行delete_me.py,你可以使用一些带有超时而不是睡眠的.bat文件或任何你想要的其他文件