Foros Python

Versión completa: Problema con el resultado de subprocess.getstatusoutput
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Hola, no consigo ejecutar la variable

date = subprocess.getstatusoutput('date')

en mi lcd. Intento ejecutar el comando date y guardarlo en la variable date, pero cuando la pongo en este script de prueba
de esta forma LCD.lcd_string((date),LCD.LINE_1) me da un error, pero creo que es causa del modulo LCDLIB16x2 as LCD ya que cuando ejecuto el script con la variable me da un error en el : File "/home/pi/Desktop/LCDLIB16x2.py", line 103, in lcd_string
    message = message.ljust(LCD_WIDTH,)
AttributeError: 'tuple' object has no attribute 'ljust'


Este script es el que intento ejecutar

#import
import time
import LCDLIB16x2 as LCD
import subprocess

date = subprocess.getstatusoutput('date')
 
# Initialise display
LCD.lcd_init()

while True:

# Send some test
LCD.lcd_string((date),LCD.LINE_1)
LCD.lcd_string(" 16x2 LCD Test ",LCD.LINE_2)

time.sleep(3) # 3 second delay

# Send some text
LCD.lcd_string("1234567890123456",LCD.LINE_1)
LCD.lcd_string("abcdefghijklmnop",LCD.LINE_2)

time.sleep(3) # 3 second delay

# Send some text
LCD.lcd_string(" Visita ",LCD.LINE_1)
LCD.lcd_string(" bot-boss.com ",LCD.LINE_2)

time.sleep(3)
GPIO.cleanup()


Este script es el modulo que me da error


#import
import RPi.GPIO as GPIO
import time

# Define GPIO to LCD mapping
LCD_RS = 26
LCD_E = 19
LCD_D4 = 13
LCD_D5 = 6
LCD_D6 = 5
LCD_D7 = 11

# Define some device constants
LCD_WIDTH = 16 # Maximum characters per line
LCD_CHR = True
LCD_CMD = False

LINE_1 = 0x80 # LCD RAM address for the 1st line
LINE_2 = 0xC0 # LCD RAM address for the 2nd line

# Timing constants
E_PULSE = 0.0005
E_DELAY = 0.0005

GPIO.setmode(GPIO.BCM) # Use BCM GPIO numbers
GPIO.setup(LCD_E, GPIO.OUT) # E
GPIO.setup(LCD_RS, GPIO.OUT) # RS
GPIO.setup(LCD_D4, GPIO.OUT) # DB4
GPIO.setup(LCD_D5, GPIO.OUT) # DB5
GPIO.setup(LCD_D6, GPIO.OUT) # DB6
GPIO.setup(LCD_D7, GPIO.OUT) # DB7

def main():
lcd_init()
lcd_string(" Test Libreria ",LINE_1)
lcd_string(" LCD 16x2 ",LINE_2)
time.sleep(5)

def lcd_init():
# Initialise display
lcd_byte(0x33,LCD_CMD) # 110011 Initialise
lcd_byte(0x32,LCD_CMD) # 110010 Initialise
lcd_byte(0x06,LCD_CMD) # 000110 Cursor move direction
lcd_byte(0x0C,LCD_CMD) # 001100 Display On,Cursor Off, Blink Off
lcd_byte(0x28,LCD_CMD) # 101000 Data length, number of lines, font size
lcd_byte(0x01,LCD_CMD) # 000001 Clear display
time.sleep(E_DELAY)

def lcd_byte(bits, mode):
# Send byte to data pins
# bits = data
# mode = True for character
# False for command

GPIO.output(LCD_RS, mode) # RS

# High bits
GPIO.output(LCD_D4, False)
GPIO.output(LCD_D5, False)
GPIO.output(LCD_D6, False)
GPIO.output(LCD_D7, False)
if bits&0x10==0x10:
  GPIO.output(LCD_D4, True)
if bits&0x20==0x20:
  GPIO.output(LCD_D5, True)
if bits&0x40==0x40:
  GPIO.output(LCD_D6, True)
if bits&0x80==0x80:
  GPIO.output(LCD_D7, True)

# Toggle 'Enable' pin
lcd_toggle_enable()

# Low bits
GPIO.output(LCD_D4, False)
GPIO.output(LCD_D5, False)
GPIO.output(LCD_D6, False)
GPIO.output(LCD_D7, False)
if bits&0x01==0x01:
  GPIO.output(LCD_D4, True)
if bits&0x02==0x02:
  GPIO.output(LCD_D5, True)
if bits&0x04==0x04:
  GPIO.output(LCD_D6, True)
if bits&0x08==0x08:
  GPIO.output(LCD_D7, True)

# Toggle 'Enable' pin
lcd_toggle_enable()

def lcd_toggle_enable():
# Toggle enable
time.sleep(E_DELAY)
GPIO.output(LCD_E, True)
time.sleep(E_PULSE)
GPIO.output(LCD_E, False)
time.sleep(E_DELAY)

def lcd_string(message,line):
# Send string to display


message = message.ljust(LCD_WIDTH," ")

lcd_byte(line, LCD_CMD)

for i in range(LCD_WIDTH):
  lcd_byte(ord(message[i]),LCD_CHR)

if __name__ == '__main__':

try:
  main()
except KeyboardInterrupt:
  pass
finally:
  lcd_byte(0x01, LCD_CMD)
  lcd_string("Goodbye!",LINE_1)
  GPIO.cleanup()



Soy bastante nuevo, perdonadme si el error es obvio.
Hola, bienvenido.

La función getstatusoutput() retorna una tupla, mientras que tu código espera que "date" sea una cadena. Podrías corregirlo así:

Código:
date = subprocess.getstatusoutput('date')[1]

Ahí te estarías quedando con el segundo elemento de la tupla, que contiene el resultado del comando. El primer elemento, que tal vez quieras guardarlo también en una variable, es el código de finalización (exit code) del comando. Por lo general ese número es cero si el comando se ejecutó correctamente, así que podrías hacer algo así:

Código:
exitcode, date = subprocess.getstatusoutput('date')
if exitcode != 0:
    raise RuntimeError("Falló el comando date")

Saludos
Muchisimas gracias, todo solucionado