在Windows上的Python中,有没有办法确定用户是否有权访问目录?我已经看过了,os.access但它给出了错误的结果.
>>> os.access('C:\haveaccess', os.R_OK)
False
>>> os.access(r'C:\haveaccess', os.R_OK)
True
>>> os.access('C:\donthaveaccess', os.R_OK)
False
>>> os.access(r'C:\donthaveaccess', os.R_OK)
True
Run Code Online (Sandbox Code Playgroud)
难道我做错了什么?有没有更好的方法来检查用户是否有权访问目录?
有没有简单的方法来检查路径是否有效?该文件现在不必存在,我想知道它是否存在.
我目前的版本是这样的:
try:
f = open(path)
except:
<path invalid>
Run Code Online (Sandbox Code Playgroud)
我正在考虑简单地检查路径是否包含任何这些字符.
我正在编写样板,处理命令行参数,稍后将传递给另一个函数.这个其他函数将处理所有目录创建(如果需要).因此我的bp只需要检查输入字符串是否是有效目录,或者是有效文件,还是其他东西.即它需要区分"c:/ users/username /"和"c:/users/username/img.jpg"之类的东西
def check_names(infile):
#this will not work, because infile might not exist yet
import os
if os.path.isdir(infile):
<do stuff>
elif os.path.isfile(infile):
<do stuff>
...
Run Code Online (Sandbox Code Playgroud)
标准库似乎没有提供任何解决方案,但理想的是:
def check_names(infile):
if os.path.has_valid_dir_syntax(infile):
<do stuff>
elif os.path.has_valid_file_syntax(infile):
<do stuff>
...
Run Code Online (Sandbox Code Playgroud)
在打字时考虑问题之后,我无法理解一种检查(仅基于语法)字符串是否包含除文件扩展名和尾部斜杠之外的文件或目录(两者都可能不存在)的方法.可能刚刚回答了我自己的问题,但是如果有人想到我的随意,请发帖.谢谢!
我有一个用Delphi 7编写的应用程序,它不需要运行管理员权限.
出于某种原因,即使应用程序未请求UAC提升,我也能够从应用程序中将文件保存到c:\ windows和c:\ windows\system32 .我以管理员身份登录并启用了UAC,但我没有更改任何默认的UAC设置.这些文件实际上也显示在Windows资源管理器下.我没有使用"以管理员身份运行"选项.
如果我尝试在相同的配置文件下使用写字板做同样的事情,我会得到预期的错误.
有什么想法发生了什么?
该应用程序使用Ole Structured Storage来保存并包含以下清单,如果有帮助的话.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity type="win32" name="DelphiApplication" version="1.0.0.0" processorArchitecture="*"/>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
publicKeyToken="6595b64144ccf1df"
language="*"
processorArchitecture="*"/>
</dependentAssembly>
</dependency>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="asInvoker"
uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
Run Code Online (Sandbox Code Playgroud)
编辑:要清楚,我的应用程序默认情况下不会将任何内容保存到这些位置.我通过标准文件保存对话框选择这些位置.
更新
我已经找到了为什么我的申请被视为遗产,尽管包括上述清单.事实证明,第二个清单也包括在内,没有'trustInfo'部分.我已经删除了第二个清单,现在一切都很好.
谢谢你的帮助
在所有平台(包括Android,iOS等移动平台)上检查文件名是否在Python中有效的最保守的方法是什么?
防爆.
this_is_valid_name.jpg - >有效
**adad.jpg - >无效
a/ad - >无效
该文件的os模块作出如下声明:
笔记
在实际使用 open() 之前,使用 access() 来检查用户是否被授权例如打开文件会创建一个安全漏洞,因为用户可能会利用检查和打开文件之间的短时间间隔来操纵它。最好使用EAFP技术。例如:
if os.access("myfile", os.R_OK):
with open("myfile") as fp:
return fp.read()
return "some default data"`
Run Code Online (Sandbox Code Playgroud)
最好写成:
try:
fp = open("myfile")
except PermissionError:
return "some default data"
else:
with fp:
return fp.read()
Run Code Online (Sandbox Code Playgroud)
我不明白用户如何“利用”这个间隔。如果open要引发异常,我不确定如何os.access防止引发该异常。同样,如果用户以某种方式操作文件,为什么不在 EAFP 版本的open命令之前执行文件操作?
我确实理解第二个版本可能更健壮,因为os.access可能无法正确识别可能引发 a 的条件PermissionError,但我不明白LBYL版本的安全性如何。有人可以解释一下吗?
我正在编写一个简单的脚本,用于解析存储在AWS CloudWatch上的JSON文件的内容.我已经在脚本中添加了一个接受用户输入的参数解析器,并允许用户将文件的输出打印到屏幕上(以预定的方式),或允许他们将内容输出到本地JSON文件.这是一个让我难以理解的片段:
import argparse
parser = argparse.ArgumentParser(description="Process a log file")
parser.add_argument('-o', '--output', choices=[???, 'print'],
default='print', help='Specify logfile output path or print to screen')
args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)
我的问题源于这parser.add_argument条线,特别是choices论证.我想为这个标志允许两个输入,它们是print本地机器上的一个或一些有效路径.我希望当前标记为问号的选项是Python可以识别的PATH.
有没有办法,使用argparse来指定一个标志的参数之一必须是一个PATH?到目前为止,搜索结果尚无定论.
提前致谢!
python ×6
argparse ×1
directory ×1
file ×1
file-access ×1
path ×1
permissions ×1
python-os ×1
uac ×1
windows ×1