2016-12-04 1 views
1

J'ai créé une application Tkinter simple qui crée un fichier texte (s'il n'y en a pas encore) et enregistre des informations de journal dans ce fichier lorsque l'utilisateur clique sur le bouton Enregistrer. Mais j'ai fait un fichier d'installation (par cx_freeze) de mon programme (c'est en fait une petite partie de mon projet principal), et quand je l'installe dans le répertoire d'installation par défaut sur un PC Windows (C:\Program Files), un utilisateur n'est pas capable de créer le fichier journal en raison de l'absence de privilèges d'administrateur (en fait, il n'est pas possible de créer un fichier dans Program Files "d'une manière Windows normale" non plus, vous devez copier + coller le fichier). La solution la plus simple est bien sûr d'inclure le fichier journal lors de la création du programme ou de l'exécution du programme en tant qu'administrateur. Mais je ne veux pas inclure de fichier journal ou exécuter le programme en tant qu'administrateur. Je suis donc curieux de savoir s'il existe un moyen d'y parvenir. Je crois que le module subprocess de Python peut faire quelque chose, mais après avoir lu quelques docs officiels et non officiels et aussi quelques threads à propos de ça, je ne suis toujours pas capable de comprendre comment il peut vraiment résoudre mon problème. Soit dit en passant, voici mon extrait de programme:
Passer le privilège d'administration sur Windows avec Python

import tkinter as tk 
import subprocess 
import time 

class App: 
    def __init__(self, master): 
     self.master = master 

     self.saveBtn = tk.Button(self.master, text="Save", command=self.saveFn) 
     self.saveBtn.pack() 

    def saveFn(self): 
     try: 
      oldFile = open('log.txt', 'r') 
      oldFileContent = oldFile.read() 
      oldFile.close() 

      newFile = open('log.txt', 'w') 
      newFile.write(oldFileContent + '\n' + str(time.asctime()) + ';') 
      newFile.close() 
     except: 
      file = open('log.txt', 'w') 
      file.write(str(time.asctime()) + ';') 
      file.close() 

root = tk.Tk() 
myApp = App(root) 
root.mainloop() 
+1

Pas la réponse que vous recherchez, mais Windows recommande d'écrire des fichiers non sensibles à l'aide des répertoires de profils (https://msdn.microsoft.com/fr-fr/library/windows/desktop/bb776896(v=vs .85) .aspx). Dans votre cas FOLDERID_LocalAppData ou FOLDERID_ProgramData – lucasg

+0

@lucasg merci pour l'info! Mais comment suis-je censé l'implémenter en Python? Je pense qu'il pourrait être utile dans Windows 'Task Scheduler'? –

+1

jetez un oeil à winpaths: http://ginstrom.com/code/winpaths.html – lucasg

Répondre

1

Vous ne devez pas essayer de sauvegarder vos données dans le répertoire Program Files. C'est le cas pour tous les grands systèmes d'exploitation: par exemple, vous ne devez pas essayer d'enregistrer vos données dans le dossier bin sous Linux.

Vos données doivent être placées dans le répertoire de l'utilisateur actuel (C:\Users\YourUserName).

Pour obtenir le chemin vers le répertoire de l'utilisateur actuel en Python (en mode multi-plateforme), vous pouvez utiliser le code comme ceci:

import os.path 

path_to_users_directory = os.path.expanduser("~") 

Ce code placera chemin vers le répertoire de votre utilisateur actuel dans path_to_users_directory variables

Ce sera 'C:\\Users\\YourUserName' sous Windows et '/home/YourUserName' sous Linux.