每次调用此方法时,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
,但是如果用户想要在myOtherFolder
中使用名为myFolder
的文件夹(因此~/myFolder/myOtherFolder/
),则可以使用folder=''
。这是我正在尝试实现的功能,因此如果没有参数传递给方法我会使用{{1}}(我认为这是问题)。
答案 0 :(得分: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条件下的“是”拼写错误(你的意思是“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)
此外,如果您正在存储配置文件,那么如果您真的使用“〜/ .myFolder”之类的东西,那么您可以轻松地关注XDG basedir spec:
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)
答案 1 :(得分:0)
我想它会进入你的初始if
子句的第二部分。在环境中运行时,可以打印出envar的值和os.environ中的键吗?那应该给你答案。此外,您意识到os.environ
是服务器运行的环境,并且不依赖于客户端的任何内容,不是吗?