我想在python脚本中获取命令的输出。该命令非常简单-ls -l $filename | awk '{print $5}'
,实际上可以捕获文件的大小
我尝试了几种方法,但是我不知如何无法正确传递变量文件名。
这两种方法我都做错了什么?
感谢您的帮助
尝试了以下两种不同方式:
name = subprocess.check_output("ls -l filename | awk '{print $5}'", shell=True)
print name
这里ls
抱怨我完全理解不存在文件名,但是我不确定将文件名作为变量传递该怎么做
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
这里只打印任何内容。
实际结果将是文件的大小。
答案 0 :(得分: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
我要添加此subprocess
示例,因为有关在此问题上使用os
的讨论。我决定在stat
命令上使用ls
命令。我还使用了subprocess.check_output
而不是您问题中使用的subprocess.Popen
。可以将以下示例添加到带有错误处理的try块中。
subprocess.check_output - reference
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')
我的个人偏好是os
模块,但您的个人偏好可能是subprocess
模块。
希望,这三种方法之一将有助于解决您的问题。