subprocess zwraca b'string'

0

Przepisując kod z python 2 na python 3 napotkałem na pewną zmianę z którą nie mogę sobie poradzić. Wywołanie linii powoduję, że zamiast zwrócić mi string otrzymuję coś takiego: b'string' z tego co wyczytałem to w python 3 zamiast stringów zwracane są dane w formie bitów i można je przekonwertować na string natomiast po przekonwertowaniu i próbie porównania ze stringiem błędu nie ma ale porównanie nie działa... Kod wygląda tak:

check = subprocess.check_output("xrandr | grep 1680x1050 | cut -c 4-12 | tail -n1", shell=True)
print(check) #zwraca b'1680x1050'
check = check.decode("utf-8")
check = str(check)
print(check) #zwraca 1680x1050
if check == "1680x1050":
	print("Monitor") #to juz sie nie wyswietla...
0
  1. bajtów a nie bitów ;)
  2. Obstawiam ze są tam jakieś dodatkowe znaki, spacje, taby czy coś i w rzeczywistości to co "widzisz" na ekranie przy print to wcale nie jest cała zawartość tej zmiennej. Sugerowałbym zrobić tak:
check = subprocess.check_output("xrandr | grep 1680x1050 | cut -c 4-12 | tail -n1", shell=True)
print(codecs.encode(check,"hex"))

I pokazać jaki to daje wynik. W hexcode będzie widać wszystkie znaki.
3. Możesz też jak człowiek użyć jakiegoś PyCharma i debugera, a nie robić dupa debugging printami jak zwierze... ;]

0

Chyba się kodowanie nie zgadza, może pomoże:

if check == u"1680x1050":

zerknij też na type(check)

0

Hehe używam PyCharma i on nie widzi problemu. Sprawdzę jak będę przy moim kompie typy tych dwóch zmiennych jak wspomniał krsp bo wydaje mi się, że tutaj może być problem. Sprawdzę też w hexach może rzeczywiście coś się tam ukrywa.

0

Jeśli chcesz być pewien, to użyj magicznego switcha python3 -b app.py:

       -b     Issue   warnings   about   str(bytes_instance),   str(bytearray_instance)  and  comparing
              bytes/bytearray with str. (-bb: issue errors)

1 użytkowników online, w tym zalogowanych: 0, gości: 1