我正在使用subprocess模块编写python代码,我陷入了这种情况,我需要使用管道将命令的结果传递给另一个以获得我需要的特定数据。
但是,这也可以通过纯Python代码实现。
交货)
from subprocess import Popen
cmd_result = Popen('ls -l ./ | awk -F " " '{if ($5 > 10000) print $0}'' | grep $USER', shell=True).communicate().split('n')
或
cmd_result = Popen('ls -l ./', shell=True).communicate().split('n')
result_lst = []
for result in cmd_result:
result_items = result.split()
if int(result_item[4]) > 10000 and result_item[2] == "user_name":
result_lst.append(result)
我想知道哪种方法在效率方面比另一种方法更好。我发现使用纯python代码的代码比使用管道的代码慢,但不确定这是否意味着使用管道更有效。
提前谢谢你。
最好的解决方案就是完全避免使用子进程。
import os
myuid = os.getuid()
for file in os.scandir("."):
st = os.stat(file)
if st.st_size > 10000 and st.st_uid == myuid:
print(file)
一般来说,如果您想运行并捕获命令的输出,到目前为止最简单的是subprocess.check_output
;但实际上,不要解析ls
的输出,当然,如果效率很重要,尽量避免多余的子进程,如无用的grep
。
files = subprocess.check_output(
"""ls -l . | awk -v me="$USER" '$5 > 10000 && $2 == me { print $9 }'""",
text=True, shell=True)
这有几个其他问题;$4
可以包含空格(在我的系统上确实如此),如果包含空格,$9
可以只包含文件名的开头。
如果你需要运行一个进程,可以并发地产生大量的输出,并在它到达时获取它的输出,而不是当进程完成时,堆栈溢出subprocess
标签信息页面有几个链接到如何做到这一点的问题;我猜你问的这个简单的任务不值得花精力,尽管它可能对更复杂的任务有用。