如何解决python上os.system中的花括号
在linux终端中,我可以删除目录中的所有文件,包括隐藏文件:
sudo rm -rf /path/to/folder/{*,.*} 2> /dev/null
我正在尝试通过 python 中的 os.system 运行以下命令:
>>> os.system('sudo rm -rf /path/to/folder/{*,.*}')
这将在没有任何错误的情况下退出(退出代码 0)但不会删除任何内容。
我在这里理解大括号可能有特殊含义,但尝试 \{*,.*\}
不会改变任何内容。
想知道这里发生了什么以及如何告诉 python 在终端中使用花括号。
为了完成工作,我可以做到:
os.system('sudo rm -r /path/to/folder/* /path/to/folder/.myHiddenFile') # or other combination
但我想了解如何在此处使用花括号。
解决方法
os.system
调用 C 标准库函数 system
,它使用 /bin/sh -c
执行命令。
由于您使用的花括号扩展是 bash 功能,因此 os.system
使用的底层 shell 根本无法理解。
要解决此问题,您可以通过使用 /bin/bash
参数调用 -c
(或任何 bash 所在的位置)在 bash 中显式执行命令。例如
os.system("/bin/bash -c 'sudo rm -rf /path/to/folder/{*,.*}'")
注意:使用单引号,因为 sudo
需要使用单引号。
os
只是帮助您进行与操作系统相关的系统调用的子集。您所描述的花括号扩展不是与操作系统相关的功能,而是一个 bash 习语。我怀疑它通常在其他(非 bash)shell 中也可用。
bash 花括号功能解析您的花括号表达式并使用规则将其转换为更详细的表达式。如果您在 Google 上搜索“bash 花括号”,您可以在 here 以及互联网上的其他地方阅读更多相关信息。
如果您想做类似于 bash 花括号对文件所做的事情,请查看 python 库 glob
。如果你想做一些类似于 bash 花括号对文本或数字所做的事情,你可以看看 itertools
。 (或者,在所有这些情况下,也许您真的只想编写一个简单的 for 循环。)
os.system
不做外壳扩展。这意味着花括号保持原样,不会像您在终端中习惯的那样替换。要获得此功能,您可以将 subprocess.run
与 shell=True
结合使用:
import subprocess,shlex
result = subprocess.run(shlex.split("sudo rm -rf /path/to/folder/{*,.*}"),shell=True) # shlex.split converts the string into an argument list
print("rm exited with exit code %s,and printed following output\n%s\n and following errors\n%s\n" % (result.exitcode,result.stdout,result.stderr))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。