1

每次我调用此方法时,Python 都会在我的目录中创建一个文件夹。该方法在我的一个需要访问服务器本地区域的 Django 应用程序中。

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,但是如果用户想要使用内部调用的文件夹myOtherFoldermyFolder因此~/myFolder/myOtherFolder/),那么他们可以。这是我试图实现的那种功能,因此folder=''如果没有参数传递给方法(我认为这是问题),我会使用。

4

2 回答 2

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 条件中的“is”错字的最大变化(您的意思是“in”吗?)。

但是,您似乎希望 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 规范,如果您真的使用“~/.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)
于 2010-02-03T11:19:59.823 回答
0

if我想这将进入您初始条款的第二部分。当你在你的环境中运行它时,你能打印出 envar 的值和 os.environ 中的键吗?那应该会给你答案。此外,您意识到这os.environ是您的服务器运行的环境,并且不依赖于客户端的任何内容,不是吗?

于 2010-02-03T11:14:13.240 回答