使用Python在文件上运行Bash命令
因此,我正在创建一个脚本,它需要遍历服务器上的所有文件,运行每个文件名,后跟命令“ll”,然后获取该命令的输出并将其打印到txt文件中 例如: 文件夹/filename.txt ll 输出:somethingsomethingother-这将发送到output.txt文件 文件夹/子文件夹/filename3.txt ll 输出:somethingsomethingother-这将发送到output.txt文件 这就是我到目前为止所做的:使用Python在文件上运行Bash命令,python,python-2.7,Python,Python 2.7,因此,我正在创建一个脚本,它需要遍历服务器上的所有文件,运行每个文件名,后跟命令“ll”,然后获取该命令的输出并将其打印到txt文件中 例如: 文件夹/filename.txt ll 输出:somethingsomethingother-这将发送到output.txt文件 文件夹/子文件夹/filename3.txt ll 输出:somethingsomethingother-这将发送到output.txt文件 这就是我到目前为止所做的: import os with open("output
import os
with open("output.txt", "w") as a:
for path, subdirs, files in os.walk(r'C:\Users\user\Desktop\Test_Py'):
for filename in files:
f = os.path.join(filename)
m = f + ' ll'
a.write(str(m) + os.linesep)
所以我现在想弄清楚的是如何使用“ll”命令运行打印出来的文件名。到目前为止,这段代码将把该文件夹及其子文件夹中所有文件的名称写入myoutput.txt文件
有人有什么想法吗?为了使用“ll”命令运行文件,您可以使用python中提供的模块 您的修订代码将是:-
import os
import subprocess
import shlex
with open("output.txt", "w") as a:
for path, subdirs, files in os.walk(r'C:\Users\user\Desktop\Test_Py'):
for filename in files:
f = os.path.join(filename)
m = f + ' ll'
cmd_args = shlex.split(m)
output = subprocess.check_output(cmd_args)
a.write(output + os.linesep)
使用操作系统():
这将仅将标准输出发送到output.txt
文件。如果还想向output.txt
发送错误消息,请改用m=f+'ll>output.txt 2>&1'
说明:
os.system(command\u string)
将在系统中执行命令command\u string
,就像您在终端中键入该命令一样。
操作符在Windows和Linux中是标准的,用于将命令的标准输出重定向到文件中。末尾的2>&1
额外参数是唯一不太清楚的部分:它将标准错误重定向到标准输出的同一位置。查看关于最后一部分的更多信息。检查子流程
模块可能的重复。值得注意的是,在Perl中,您可以通过打开文件(例如open(my$pipeline,“| command | command>file”);
)来写入管道,但Python不允许这样做。@Eliot。Python执行该功能。如果Python使用与Perl相同的语法,这会很奇怪,你不这么认为吗?@Paddy3118是的,我只是指出一些常识:)事实证明,我要到周四才能测试出来,但我想首先感谢你的回答。我相信这会奏效。也谢谢你的解释,这真的很有帮助。在周四检查后,我会让您知道它是否有效。我们应该将os.system
调用替换为它们的子进程
对应调用。因此,否决票。@user1636295:子流程
比os.system
更通用。然而,os.system
并没有被弃用,所以使用它没有什么大问题,尽管Python文档建议[1]人们使用子流程
。您可以用子流程调用(m,shell=True)
[1]替换操作系统(m)
行。对于这些情况,我更喜欢system
,因为它不太冗长。[1]
import os
with open("output.txt", "w") as a:
for path, subdirs, files in os.walk(r'C:\Users\user\Desktop\Test_Py'):
for filename in files:
f = os.path.join(filename)
m = f + ' ll > output.txt'
os.system(m)