Python 3.x ls-l|awk某物的打印输出

Python 3.x ls-l|awk某物的打印输出,python-3.x,subprocess,Python 3.x,Subprocess,我想在python脚本中获得命令的输出。该命令非常简单-ls-l$filename | awk'{print$5}',基本上捕获文件的大小 我尝试了几种方法,但不知何故无法正确地传递变量文件名 这两种方法我都有什么错 谢谢你的帮助 尝试了以下两种不同的方法: 方法1 在这里,ls抱怨文件名不存在,我完全理解这一点,但我不确定如何将文件名作为变量传递 方法2 这里什么也没印出来 实际结果是文件的大小。内置Python模块os可以为您提供特定文件的大小 以下是与以下方法相关的文档 以下是使用Py

我想在python脚本中获得命令的输出。该命令非常简单-
ls-l$filename | awk'{print$5}'
,基本上捕获文件的大小

我尝试了几种方法,但不知何故无法正确地传递变量文件名

这两种方法我都有什么错

谢谢你的帮助

尝试了以下两种不同的方法:

方法1 在这里,
ls
抱怨文件名不存在,我完全理解这一点,但我不确定如何将文件名作为变量传递

方法2 这里什么也没印出来


实际结果是文件的大小。

内置Python模块
os
可以为您提供特定文件的大小

以下是与以下方法相关的文档

以下是使用Python模块
os
获取文件大小的两种方法:

import os

# Use os.stat with st_size
filesize_01 = os.stat('filename.txt').st_size
print (filesize_01)
# outputs 
30443963

# os.path.getsize(path) Return the size, in bytes, of path.
filesize_02 = os.path.getsize('filename.txt')
print (filesize_02)
# outputs 
30443963
我添加了这个
子流程
示例,因为在这个问题上有关于使用
os
的对话。我决定在
ls
命令上使用
stat
命令。我还使用了
subprocess.check_output
,而不是您的问题中使用的
subprocess.Popen
。下面的示例可以添加到具有错误处理的try块中

我个人的偏好是
操作系统
模块,但你的偏好可能是
子流程
模块


希望这三种方法中的一种能帮助你解决问题

你看过内置的Python模块操作系统吗?使用
ls
,即使在bash中,这也是不好的做法,更不用说在Python中了;请参见和。也就是说,您的
awk
中的
^default
有什么用?您只打印名称以
default
开头的文件的大小,而忽略任何其他文件名。为什么不干脆
second=['awk','{print$5}']
与您的“第一个”comand对等?(需要明确的是,在任何情况下都不应该在生产代码中实际使用这种方法,但修复它可能有助于证明问题出在awk代码上,而不是在Python中如何使用它)。@lifeicomplex,我曾经使用过操作系统。但后来我看到一篇文章,说操作系统不应该再使用了,据说子流程更好。@CharlesDuffy,这里的python新手,并没有意识到默认值必须是某种东西。我会查的。最后一行的第三行应该是“02”,而不是“01”,但是编辑不会接受更正,除非我对其他5个字符也做了不必要的更改。@RayButterworth谢谢。剪切和粘贴杀死了我们中最好的人。最初我在阅读“使用
os
替代”建议,建议使用
os.popen()
或类似的方法,但实际上你所建议的是更好的做法。@charlesduff谢谢。这些方法似乎比子流程的方法更干净、更安全。@droidian,使用
os.system()
os.popen()
os
的任何其他部分做与
子流程
相同的事情是不行的。但是这里告诉您要使用的
操作系统
部分与
子流程
完全不同。
first = ['ls', '-l', filename]
second = ['awk', ' /^default/ {print $5}']
p1 = subprocess.Popen(first, stdout=subprocess.PIPE)
p2 = subprocess.Popen(second, stdin=p1.stdout, stdout=subprocess.PIPE)
out = p2.stdout.read()
print out
import os

# Use os.stat with st_size
filesize_01 = os.stat('filename.txt').st_size
print (filesize_01)
# outputs 
30443963

# os.path.getsize(path) Return the size, in bytes, of path.
filesize_02 = os.path.getsize('filename.txt')
print (filesize_02)
# outputs 
30443963
from subprocess import check_output

def get_file_size(filename):

   # stat command
   # -f display information using the specified format
   # the %z format selects the size in bytes
   output = check_output(['stat', '-f', '%z', str({}).format(filename)])

   # I also use the f-string in this print statement.
   # ref: https://realpython.com/python-f-strings/
   print(f"Filesize of {filename} is: {output.decode('ASCII')}")
   # outputs 
   30443963

get_file_size('filename.txt')