2010-02-03 2 views
1

Python создает папку в моем каталоге каждый раз, когда я вызываю этот метод. Этот метод находится в одном из моих приложений Django, который требует доступа к локальной области сервера.Python Создание нежелательной папки в каталоге

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) 

Я бы хотел остановить это.

Обратите внимание:: пользователь может указать, находится ли он в другом каталоге по умолчанию. Поэтому папка по умолчанию - myFolder, однако, если пользователь хочет использовать папку с именем myOtherFolder в пределах myFolder (поэтому ~/myFolder/myOtherFolder/), то они могут. Это тот тип функциональности, который я пытаюсь реализовать, поэтому я использую folder='', если аргумент не передан методу (что я считаю проблемой).

ответ

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) 

Наибольшее изменение, устраняющее опечатку «есть» у вас в первом условии if (вы имели в виду «в»?).

Тем не менее, кажется, что Вы хотите envar переопределить "~/MyFolder", а не "~/MyFolder/otherSpecifiedByUser", что дает:

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) 

Кроме того, если вы храните конфигурационные файлы, то вы можете тривиально следуют XDG basedir spec, если вы действительно используете что-то вроде «~/.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

к сожалению до сих пор не работает. Может быть, я был немного неясен, я только что обновил свой первоначальный вопрос. – Federer

+0

@ theEconomist: Я думаю, вы сделали это более неясным. Если вы не хотите создавать каталог, то отбросьте часть всего makedirs. (Удалите все в моем коде с «try» до «return».) Вы можете проверить, что каталог существует, или просто вернуть результат, и позволить обработать код более высокого уровня (поскольку похоже, что он имеет сходные проблемы в любом случае). – 2010-02-03 12:39:19

0

Я предполагаю, что это входит во вторую часть вашего начального предложения if. Можете ли вы распечатать значения envar и ключей в os.environ, когда вы запускаете это в своей среде? Это должно дать вам ответ. Кроме того, вы понимаете, что os.environ - это среда, в которой работает ваш сервер, и не зависит от чего-либо от клиента, не так ли?