2017-02-02 1 views
0

J'essaie de créer un script python à convertir en exe qui se supprime tout seul. Quand je l'exécute en tant que fichier .py cela fonctionne. Le code est le suivant:Python exe ne se supprimant pas

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

Je travaille dans Windows qui est pourquoi j'utilise \\ et le fichier est évidemment nommé test.py. Mais quand je le convertis en un fichier exe (j'ai essayé à la fois avec py2exe et pyinstaller) il me donne l'accès refusé erreur. Est-ce que quelqu'un sait comment réparer ceci? PS: Oui, j'ai changé le nom en test.exe si vous demandez.

+3

Possible dupliquer de [Comment un programme peut supprimer son propre exécutable] (http: // stackoverflow. com/questions/1606140/how-can-a-program-delete-its-own-executable) –

Répondre

0

Ce ne sera pas si simple. 1) Lorsque vous exécutez le script, c'est python.exe qui exécute les instructions et le fichier script (test.py) est gratuit. De cette façon, python.exe peut supprimer le script. 2) Lorsque vous convertissez convertir votre script en exe, c'est le fichier exe lui-même en cours d'exécution, ce qui signifie que le fichier est 'occupé', ou dit en d'autres termes - utilisé par le processus, et ne peut pas être supprimé.

Trouver un moyen de démarrer un autre processus qui supprimerait le fichier après avoir quitté le processus en cours.

Edit (exemple de code):


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)

si __name__ == '__main__': main()

Et cela a été compilé avec `pyinstaller.exe --onefile --windowed D: \ self_delete.py

exécuter la fonction est un peu chose que nous utilisons pour exécuter des appels sur Linux et Windows et je viens de le copier. C'est pourquoi la vérification de la plateforme est là. Vous pouvez utiliser un fichier .bat avec timeout au lieu de veille ou tout ce que vous voulez si vous ne pouvez pas exécuter delete_me.py

+0

J'ai essayé de faire en sorte que le script python crée et exécute un fichier bat temporaire qui supprime le script et lui-même ... même chose , fonctionne avec .py, ne fonctionne pas avec .exe. Je ne sais pas comment je pourrais le faire –

+0

J'ai édité ma réponse, vérifiez le code - cela fonctionne pour moi. – DTL