Quel serait le meilleur moyen en Python de déterminer si un répertoire est accessible en écriture pour l'utilisateur exécutant le script? Comme cela impliquera probablement l'utilisation du module os, je dois mentionner que je l'exécute sous un environnement * nix.
python
file
permissions
directory
operating-system
tigre illuminé
la source
la source
os.access()
est qu'il vérifie en utilisant les vrais UID et GID, pas les effectifs . Cela pourrait provoquer des bizarreries dans les environnements SUID / SGID. ('mais le script exécute setuid root, pourquoi ne peut-il pas écrire dans le fichier?')os.access(dirpath, os.W_OK | os.X_OK)
renvoie True même si je n'ai pas d'accès en écriture.Cela peut sembler étrange à suggérer, mais un idiome Python commun est
Suivant cet idiome, on pourrait dire:
Essayez d'écrire dans le répertoire en question et détectez l'erreur si vous n'avez pas l'autorisation de le faire.
la source
except: pass
- de cette façon, vous pouvez toujours être optimiste et avoir une bonne opinion de vous-même. / sarcasme éteint. Maintenant, pourquoi voudrais-je, par exemple essayer d'écrire quelque chose dans chaque répertoire de mon système de fichiers, pour produire une liste d'emplacements inscriptibles?Ma solution utilisant le
tempfile
module:Mise à jour: Après avoir testé à nouveau le code sur Windows, je vois qu'il y a effectivement un problème lors de l'utilisation de tempfile là-bas, voir issue22107: le module tempfile interprète mal une erreur d'accès refusé sur Windows . Dans le cas d'un répertoire non accessible en écriture, le code se bloque pendant plusieurs secondes et lance finalement un fichier
IOError: [Errno 17] No usable temporary file name found
. C'est peut-être ce qu'observait user2171842? Malheureusement, le problème n'est pas résolu pour l'instant, donc pour gérer cela, l'erreur doit également être détectée:Le retard est bien sûr toujours présent dans ces cas alors.
la source
tempfile
. il ne fonctionne que lorsqu'il n'y a aucuneOSError
signification qu'il a l'autorisation d'écrire / supprimer. sinon, ce ne sera pas le casreturn False
car aucune erreur n'est renvoyée et le script ne continuera pas à s'exécuter ou à se terminer. rien n'est retourné. c'est juste coincé à cette ligne. cependant, la création d'un fichier non temporaire tel que la réponse de khattam fonctionne à la fois lorsque l'autorisation est autorisée ou refusée. Aidez-moi?Je suis tombé sur ce fil à la recherche d'exemples pour quelqu'un. Premier résultat sur Google, bravo!
Les gens parlent de la manière pythonique de le faire dans ce fil, mais pas d'exemples de code simples? Ici vous allez, pour toute autre personne qui trébuche:
Cela tente d'ouvrir un descripteur de fichier pour l'écriture et se termine avec une erreur si le fichier spécifié ne peut pas être écrit: C'est beaucoup plus facile à lire et c'est une bien meilleure façon de le faire plutôt que de faire des pré-vérifications sur le chemin du fichier ou le répertoire , car il évite les conditions de course; les cas où le fichier devient inscriptible entre le moment où vous exécutez la pré-vérification et le moment où vous essayez réellement d'écrire dans le fichier.
la source
Si vous ne vous souciez que des fichiers permanents,
os.access(path, os.W_OK)
faites ce que vous demandez. Si vous voulez plutôt savoir si vous pouvez écrire dans le répertoire,open()
un fichier de test pour l'écriture (il ne devrait pas exister auparavant), attraper et examiner toutIOError
, et nettoyer le fichier de test par la suite.Plus généralement, pour éviter les attaques TOCTOU (seulement un problème si votre script s'exécute avec des privilèges élevés - suid ou cgi ou plus), vous ne devriez pas vraiment faire confiance à ces tests à l'avance, mais abandonner privs, faire le
open()
, et attendre leIOError
.la source
Vérifiez les bits de mode:
la source
Voici quelque chose que j'ai créé sur la base de la réponse de ChristopheD:
la source
plus d'informations sur l'accès peuvent être trouvées ici
la source
J'ai rencontré ce même besoin en ajoutant un argument via argparse. Le intégré
type=FileType('w')
ne fonctionnait pas pour moi car je cherchais un répertoire. J'ai fini par écrire ma propre méthode pour résoudre mon problème. Voici le résultat avec l'extrait argparse.Cela se traduit par ce qui suit:
Je suis retourné et j'ai ajouté print opts.dir à la fin, et tout semble fonctionner comme souhaité.
la source
Si vous avez besoin de vérifier la permission d' un autre utilisateur (oui, je réalise que cela contredit la question, mais peut être utile pour quelqu'un), vous pouvez le faire via le
pwd
module et les bits de mode du répertoire.Clause de non- responsabilité - ne fonctionne pas sous Windows, car il n'utilise pas le modèle d'autorisations POSIX (et le
pwd
module n'y est pas disponible), par exemple - solution uniquement pour les systèmes * nix.Notez qu'un répertoire doit avoir tous les 3 bits définis: lecture, écriture et exécution.
Ok, R n'est pas un must absolu, mais sans lui, vous ne pouvez pas lister les entrées dans le répertoire (vous devez donc connaître leurs noms). Exécuter en revanche est absolument nécessaire - sans cela, l'utilisateur ne peut pas lire les inodes du fichier; donc même avoir W, sans X, les fichiers ne peuvent pas être créés ou modifiés. Explication plus détaillée sur ce lien.
Enfin, les modes sont disponibles dans le
stat
module, leurs descriptions sont en inode (7) man .Exemple de code comment vérifier:
la source