我试图创建一个python脚本来转换成只删除自己的exe。当我将它作为.py文件运行时,它可以工作。代码是这样的:
import os
os.remove(os.getcwd + "\\test.py")
我在Windows工作,这就是为什么我使用\\而且该文件显然名为test.py.但是当我将它转换为exe文件时(我已经尝试过使用py2exe和pyinstaller)它会给我访问拒绝错误。有谁知道如何解决这个问题?
PS:是的,如果您要问,我已将名称更改为test.exe。
答案 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文件或任何你想要的其他文件