Python 3.x 测试我是否有权限在Python3中的路径处创建文件夹?
我正在使用tkinter用Python3创建一个应用程序。我的应用程序从物理设备收集数据,并需要将其存储在硬盘上。 该程序允许用户指定一个目录,用于存储数据。这是通过Python 3.x 测试我是否有权限在Python3中的路径处创建文件夹?,python-3.x,permissions,Python 3.x,Permissions,我正在使用tkinter用Python3创建一个应用程序。我的应用程序从物理设备收集数据,并需要将其存储在硬盘上。 该程序允许用户指定一个目录,用于存储数据。这是通过tkinter.filedialog中的askdirectory完成的 选择目录后,我需要检查目录是否有效。如果软件有权在指定目录中创建具有任意名称的新目录,则目录有效。这就是我被卡住的地方。 我在互联网上读到,我可以使用os.access(path,perm)并检查path的权限。以下是在python 3.7.0中使用没有管理员权
tkinter.filedialog
中的askdirectory
完成的
选择目录后,我需要检查目录是否有效。如果软件有权在指定目录中创建具有任意名称的新目录,则目录有效。这就是我被卡住的地方。我在互联网上读到,我可以使用
os.access(path,perm)
并检查path的权限。以下是在python 3.7.0中使用没有管理员权限的标准用户的结果示例:
>>> os.access("C:\Program Files\Android", os.W_OK | os.X_OK)
True
>>> os.access("C:\Program Files\kjkjieikjd", os.W_OK | os.X_OK)
False
>>> os.access("C:\Program Files", os.W_OK | os.X_OK)
True
这不是我想要的结果,因为如果给定的目录可以被创建或已经存在,则为True,否则为False。
相反,如果我可以在给定目录中创建任意目录,我需要它返回True。在上面的示例中,它们都应该返回False,因为没有管理员授权,标准用户无法在程序文件
中创建文件夹
我还读到,我可以尝试创建一个文件夹,并使用os.makedirs
测试异常。这种方法也不起作用,因为任何任意目录都可以包含任意子目录,os.makedirs
在目录已经存在时引发异常。在这种情况下,我必须生成随机目录名并等待,直到我成功创建文件夹,或者我得到一个异常,它不是fileexisterror
,这不是很好
这两种方法都依赖于创建特定目录的想法,但在我的例子中,我需要能够创建任意目录
如何在Python 3.7.0中检查我是否有权在给定路径上创建任意目录?除了目录权限之外,还有很多因素会阻止您在自定义位置创建文件夹和文件。例如:
- 父目录是可写的,但其子目录(具有您想要使用的名称)是不可写的
- 磁盘空间不足
- 中断访问系统目录
def validate_path(path):
try:
os.makedirs(path, exist_ok=True)
temp_dir_path = tempfile.mkdtemp(dir=path)
os.rmdir(temp_dir_path)
return True
except OSError:
return False
或者(正如@Martijn Pieters所建议的)一个稍微短一点的等效变体,用作上下文管理器:
def validate_path(path):
try:
os.makedirs(path, exist_ok=True)
with tempfile.TemporaryDirectory(dir=path):
return True
except OSError:
return False
注1:is nessery,否则如果path
不存在,则创建临时目录将失败
注2:如果您使用低于3.3的Python,则不应捕获OSError,而应捕获。谢谢您的回答。我尝试了您的代码示例,但它似乎卡在了第4行
temp\u dir\u path=tempfile.mkdtemp(dir=path)
。当我提供有效路径时,它可以正常工作,但当我提供无效路径时,脚本会暂停。您可以对tempfile.TemporaryDirectory(dir=path)使用:返回True
,此时您不必担心遥控器会再次出现。@MartijnPieters您是对的,谢谢,我已更新了答案。在Windows上使用tempfile检查权限时,请注意Python中的此错误: