我想知道使用os.system()在Python脚本中调用bash命令是否合适。我也想知道这样做是否安全。
我知道如何在Bash和Python中实现我需要的一些功能,但在Bash中实现它更简单,更直观。但是,我觉得编写os.system(“bash code”)非常hack。
具体来说,我想将所有以特定扩展名结尾的文件移动到目录。
在bash中:* mv .ext / path / to / destination 在Python(伪代码)中: 对于目录中的文件: if file.endswith(“ext”): 将文件移动到目的地
在这种情况下,我该怎么办?
答案 0 :(得分:17)
首先,您的示例使用 mv ,这是 coreutils 中的程序,而不是bash。
使用os.system()调用外部程序被认为是不好的风格,因为:
查找 glob ,用于类似shell的模式匹配(globbing)和 shutil ,正如其他人已经提到的那样。否则,您需要的所有内容都已存在于标准库中。
import glob
import shutil
for extfile in glob.glob('*.ext'):
shutil.move(extfile,dest)
此外,不应使用 os.system() - 请改为使用子流程模块。
答案 1 :(得分:6)
查看Python的shutil
模块。它提供文件系统操作,如移动文件。在它和os
模块之间,您应该拥有所需的所有工具。由于其他人说的原因,这比bash命令更好。
答案 2 :(得分:3)
使用Python函数来做这种事情总是越来越好。使用Python,以独立于操作系统的方式编写脚本并不困难,而不是使用bash。
答案 3 :(得分:2)
你应该使用纯Python的一些原因,
在这种情况下,我会使用......
import os
for filename in os.listdir('.'):
if filename.endswith('.ext'):
os.rename(filename, os.path.join('path', 'to', 'new', 'destination', filename))
可能有更好的方法
答案 4 :(得分:1)
这不是主意,因为它使您的脚本很多的可移植性降低。本机python脚本可以在安装了正确python库的任何unix或windows机器上运行。当你将shell命令添加到混合中时,你会破坏它,然后突然被锁定到一个更窄的子集。
有时你没有选择,但是如果它就是那么简单,那么在python中原生地编写代码会更有意义,而且启动速度也更快(因为python进程不需要生成一个新的shell只是为了执行一个命令。)
答案 5 :(得分:1)
引用问题本身就表明纯Python解决方案更可取。
答案 6 :(得分:0)
更一般地说,Python提供了“子进程”模块,它允许您运行命令并对其输出进行广泛的控制。它允许您“生成新进程,连接到它们的输入/输出/错误管道,并获取它们的返回代码”: