Вывести вывод команды ls -l |что-то - PullRequest
0 голосов
/ 06 апреля 2019

Я хочу получить вывод команды в скрипте Python. Команда довольно проста - ls -l $filename | awk '{print $5}', по сути захватывает размер файла

Я пробовал несколько способов, но я почему-то не могу правильно передать переменную filename.

Что я делаю не так с любым подходом?

Спасибо за помощь

Пробовали два разных способа, как показано ниже:

Метод 1

name = subprocess.check_output("ls -l filename | awk '{print $5}'", shell=True)
print name

Здесь ls жалуется, что имя файла не существует, что я полностью понимаю, но я не уверен, что бы я сделал, чтобы передать имя файла в качестве переменной

Метод 2

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

Здесь просто ничего не печатается.

фактическим результатом будет размер файла.

1 Ответ

2 голосов
/ 06 апреля 2019

Встроенный модуль Python os может предоставить вам размер определенного файла.

Вот документация, относящаяся к методам ниже.

os.stat - ссылка

os.path.getsize - ссылка

Вот два метода, использующие модуль 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 - ссылка

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.

Надеюсь, один из этих трех методов поможет решить ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...