Ouvrir un répertoire sur Windows: Permission denied'
Je vais essayer d'obtenir un descripteur de fichier pour un répertoire, mais l'appel de os.open
sur sur les annuaires toujours une erreur "autorisation refusée".
Je ne crois pas que c'est un problème d'autorisation, car il arrive sur tous répertoires, alors il n'y a pas de problème sur les fichiers (Voir la RÉPLICATION de session ci-dessous). En tant qu'administrateur ne fait aucune différence.
Python 2.7.6 (default, Nov 10 2013, 19:24:18) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.mkdir('mydir')
>>> os.access('mydir', os.F_OK)
True
>>> os.access('mydir', os.R_OK)
True
>>> os.access('.', os.R_OK)
True
>>> os.access('.', os.F_OK)
True
>>> os.open('myfile', os.O_RDWR)
3
>>> os.open('mydir', os.O_RDONLY)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 13] Permission denied: 'mydir'
>>> os.open('mydir', os.O_RDWR)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 13] Permission denied: 'mydir'
>>> open('mydir')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 13] Permission denied: 'mydir'
Sur linux il fonctionne comme prévu:
>>> os.open('mydir', os.O_RDONLY)
3
La documentation n'indique pas que vous ne pouvez pas, ni aucune plate-forme de différence. Est-ce un comportement normal? Il n'est pas possible d'obtenir des descripteurs de fichiers pour les répertoires sur Windows?
- Si c'était possible, que feriez-vous avec ceux descripteur de fichier? Jetez un oeil à stackoverflow.com/questions/16574511/...
- vous ne serez pas en mesure d'élever les droits de l'intérieur python. Donc, pour surmonter ce problème, vous devez exécuter python avec l'admin ou de droits élevés, pour ouvrir votre fichier.
- Qu'advient-il si vous ouvrez une invite de commande avec "Exécuter en tant qu'Administrateur", puis essayer la même chose?
- Tom, je pense que les droits de l'amende (le répertoire est même créé en python dans le repl comme vous pouvez le voir). En tant qu'administrateur ne fait aucune différence. Je l'ai mise à jour de la question à clarifier.
Vous devez vous connecter pour publier un commentaire.
Edit:
Ce n'est pas un problème de permission, il ne fonctionnera jamais avec Python 2. Python 2 est l'aide de l'API Win 32 appel
_wopen
lorsos.open()
(code: https://github.com/python/cpython/blob/2.7/Modules/posixmodule.c#L6554). Selon les docs, il renvoie une erreur lors de l'ouverture d'un répertoire:Donc:
C'est le comportement attendu. Je dirais que dans ce cas c'est bien que ce détail n'est pas précisé dans le Python docs.
Sur Python 2, vous pouvez utiliser le module ctypes pour appeler arbitraire Win 32 méthodes de l'API de vous-même. Python 3 utilise
CreateFile
au lieu de_wopen
, plus moderne les appels de l'API, qui peut vous permettre de faire ce que vous voulez, voir ci-dessous.Vieille réponse:
La ressource la plus importante pour cette question est de la documentation pour la CreateFile Win 32 la fonction de l'API, documentée ici:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx
Vous voudrez peut-être lire les parties pertinentes de l', par exemple
Aussi, il y a un commentaire ci-dessous les docs, en disant
Python 3 utilise cette fonction dans plusieurs endroits, vous pouvez chercher par vous-même
https://github.com/python/cpython/search?q=CreateFile&type=Code
ou via git clone et l'utilisation de
grep -HR "CreateFile(" .
. En Python 3, il y a le _winapi.module c, qui est probablement utilisée lorsque vous effectuezos.open()
sur Windows.Sur Python 2, il y a un appel à _wopen dans https://github.com/python/cpython/blob/2.7/Modules/posixmodule.c#L6554, mais je ne suis pas sûr de l'endroit où il est défini. Lorsque vous suivez cette voie, vous trouverez la mise en œuvre effective. Ensuite, vous pouvez voir exactement comment Python est l'appel de cette fonction; ce, en collaboration avec les docs, seront les plus susceptibles d'expliquer vos observations.
Dirait que vous n'avez pas les autorisations sur Windows (peut-être vous faire sur Linux.) C'est à partir de http://windows.microsoft.com/en-us/windows/what-are-permissions#1TC=windows-7 et il vous indique comment trouver les permissions sur un fichier ou un répertoire.
Pour vérifier les permissions d'un fichier ou d'un dossier dans Windows:
Cliquez-droit sur le fichier ou le dossier, puis cliquez sur Propriétés.
Cliquez sur l'onglet Sécurité.
Cliquez sur un nom d'utilisateur ou de groupe sous noms d'utilisateur ou Groupe.
Les autorisations pour l'utilisateur ou le groupe sélectionné sont affichées dans la partie inférieure de la boîte de dialogue propriétés.