2010-02-03 5 views
1

Python crée un dossier dans mon répertoire chaque fois que j'appelle cette méthode. La méthode est dans l'une de mes applications Django qui nécessite un accès à la zone locale du serveur.Python Création d'un dossier indésirable dans le répertoire

def filepath(filename, foldername='', envar='MYAPPDIR'): 

    if envar is not None and envar is os.environ: 
     dirpath = os.environ[envar] 
    else: 
     dirpath = '~/myFolder/%s' % foldername  

    expanded = os.path.expanduser(dirpath) 
    if not os.path.isdir(expanded): 
     if os.path.lexists(expanded): 
      raise IOError(errno.EEXIST, "Path is a file, nor a dir", expanded) 
     os.makedirs(expanded) 

    return os.path.join(expanded, filename) 

Je voudrais l'empêcher de se produire.

Veuillez noter: l'utilisateur peut spécifier s'il se trouve dans un autre répertoire par défaut. Par conséquent le dossier par défaut est myFolder, cependant si l'utilisateur veut utiliser un dossier appelé myOtherFolder au sein de myFolder (donc ~/myFolder/myOtherFolder/) alors ils peuvent. C'est le genre de fonctionnalité que j'essaie d'implémenter, d'où mon utilisation de folder='' si aucun argument n'est passé à la méthode (ce qui me semble être le problème).

Répondre

3
def filepath(filename, foldername=None, envar='MYAPPDIR'): 
    default = '~/myFolder' 
    if foldername: 
    default = os.path.join(default, foldername) 
    dirpath = os.path.expanduser(os.environ.get(envar, default)) 

    try: 
    os.makedirs(dirpath) 
    except OSError as e: 
    if e.errno != errno.EEXIST: 
     raise 
    return os.path.join(dirpath, filename) 

changement plus grand retrait de la « est » faute de frappe que vous aviez dans la première condition de si (avez-vous dire « dans »?).

Cependant, il semble que vous voulez envar passer outre "~/myFolder", pas "~/myFolder/otherSpecifiedByUser", ce qui donne:

def filepath(filename, foldername=None, envar='MYAPPDIR'): 
    dirpath = os.path.expanduser(os.environ.get(envar, "~/myFolder")) 
    if foldername: 
    dirpath = os.path.join(dirpath, foldername) 

    try: 
    os.makedirs(dirpath) 
    except OSError as e: 
    if e.errno != errno.EEXIST: 
     raise 
    return os.path.join(dirpath, filename) 

En outre, si vous stockez des fichiers de configuration, vous pouvez suivez trivialement le XDG basedir spec, si vous êtes vraiment en utilisant quelque chose comme « ~/.myFolder »:

def filepath(filename, foldername=None, envar='MYAPPDIR'): 
    default = os.path.join(os.environ.get("XDG_CONFIG_HOME", "~/.config"), "myFolder") 
    dirpath = os.path.expanduser(os.environ.get(envar, default)) 
    if foldername: 
    dirpath = os.path.join(dirpath, foldername) 

    try: 
    os.makedirs(dirpath) 
    except OSError as e: 
    if e.errno != errno.EEXIST: 
     raise 
    return os.path.join(dirpath, filename) 
+0

malheureusement ne fonctionne toujours pas. Peut-être que j'étais un peu flou, je viens de mettre à jour ma question initiale. – Federer

+0

@theEconomist: Je pense que vous l'avez rendu plus clair. Si vous ne voulez pas créer un répertoire, alors laissez tomber toute la partie makedirs. (Supprimez tout dans mon code de "try" jusqu'à "return".) Vous pouvez vérifier que le répertoire existe à la place, ou simplement renvoyer le résultat et laisser le code de niveau supérieur gérer cela (car il semble qu'il traite de problèmes similaires de toute façon). –

0

Je suppose que cela va dans la deuxième partie de votre clause if initiale. Pouvez-vous imprimer les valeurs de envar et les clés dans os.environ lorsque vous exécutez cela dans votre environnement? Cela devrait vous donner votre réponse. En outre, vous vous rendez compte que os.environ est l'environnement dans lequel votre serveur est en cours d'exécution et ne dépend pas de quoi que ce soit du client, n'est-ce pas?

Questions connexes