gpt4 book ai didi

python - 使用 os.mkdir 与 os.system ("mkdir"的好处)

转载 作者:太空宇宙 更新时间:2023-11-03 12:23:57 26 4
gpt4 key购买 nike

我找不到答案的简单问题:

使用 os.mkdir("somedir")os.system("mkdir somedir")subprocess.call() 有好处吗,超越代码可移植性?

答案应适用于 Python 2.7。

编辑:有人提出硬编码目录与变量(可能包含用户定义的数据)会引入安全问题。我最初的问题旨在来自系统方法(即引擎盖下发生了什么),但安全问题是一个有效问题,在考虑完整答案以及包含空格的目录名称时应包括在内

最佳答案

正确性

想想如果你的目录名包含空格会发生什么:

mkdir hello world

...创建两个 目录,helloworld。如果您只是盲目地用引号替换,那么如果您的文件名包含该引号类型,那将不起作用:

'mkdir "' + somedir + '"'

...当 somedir 包含 hello "cruel world".d 时,效果很小。


安全

在以下情况下:

os.system('mkdir somedir')

...考虑如果您要替换 somedir 的变量名为 ./$(rm -rf/)/hello 会发生什么。

此外,调用 os.system()(或使用 shell=Truesubprocess.call())调用 shell,这意味着您可以接受诸如 ShellShock 之类的错误;如果你的 /bin/sh 是由易受 ShellShock 攻击的 bash 提供的,并且你的代码提供了任意环境变量存在的机制(就像通过 CGI 的 HTTP header 一样),这将提供代码注入(inject)的机会。


性能

os.system('mkdir somedir')

...启动一个shell:

/bin/sh -c 'mkdir somedir'

...然后需要链接和加载;需要解析它的参数;并且需要调用外部命令 mkdir(意味着另一个链接和加载周期)。


一个显着的改进如下:

subprocess.call(['mkdir', '--', somedir], shell=False)

...只调用外部mkdir命令,没有shell;然而,由于它涉及一个 fork()/exec() 循环,与 C 库 mkdir() 调用相比,这仍然是一个显着的性能损失。

os.mkdir(somedir) 的情况下,Python 解释器直接调用适当的系统调用——根本没有外部命令。


错误处理

如果您调用 os.mkdir('somedir') 但它失败了,您会得到一个 IOError 并抛出相应的 errno,并且可以简单地确定错误的类型。

如果 mkdir 外部命令失败,你会得到一个失败的退出状态,但如果不解析它的标准错误(它是为人类编写的,而不是机器可读的,它将内容因系统的当前语言环境而异)。

关于python - 使用 os.mkdir 与 os.system ("mkdir"的好处),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30854465/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com