TypeError: должен быть str, а не байтами

Louie Quicksell спросил: 26 декабря 2017 в 08:13 в: python

Итак, я пишу функцию, которая вытаскивает шестнадцатеричные значения цвета из учетной записи Twitter, которая помещает цвет дня. Я надеюсь отправить это на arduino, чтобы загореться и светодиод с этим цветом, но я столкнулся с проблемами при попытке написать Arduino. Я преобразовал значение шестнадцатеричного цвета в значение RGB и сохранил его в кортеже. Я пытаюсь ссылаться на каждое значение в кортеже RGB для записи из последовательного соединения с моим Arduino, однако я не могу правильно закодировать целые числа, чтобы они были отправлены. Вот конкретная часть кода, на которую я имею в виду:

 #Convert from hex to rgb
        rgb = tuple(int(this_color[i:i+2], 16) for i in (0, 2 ,4))        #Add individual rgb values to list
        rgb_values = [rgb[0], rgb[1], rgb[2]]        if (ser.isOpen()):
        # Start a main loop
            while (loopVar):                # Prompt for Red value
                redVal = rgb[0]
                print(struct.pack('>B', redVal))
                ser.write("r" + struct.pack('>B',redVal))                # Prompt for Green value
                greenVal = rgb[1]
                print(struct.pack('>B', greenVal))
                ser.write("g" + struct.pack('>B',greenVal))                # Prompt for Blue value
                blueVal = rgb[2]
                print(struct.pack('>B', blueVal))
                ser.write("b" + struct.pack('>B',blueVal))                # Check if user wants to end
                loopCheck = raw_input('Loop (y/N):')
                if (loopCheck == 'N'):
                    loopVar = False    # After loop exits, close serial connection
    ser.close()

Я думал, что мне нужно будет преобразовать целочисленные значения в raw-бинарный для использования в write.serial, но это doesn Кажется, что он работает.

Вот результат, когда я запускаю файл:

142
<class 'int'>
33
<class 'int'>
38
<class 'int'>
b'\x8e'
Traceback (most recent call last):
  File "C:\Users\Louis\Desktop\MSTI Application\Arduino Lamp\Twitter_Scraping_Script_2.py", line 117, in <module>
    get_user_tweets('color_OTD', 5)
  File "C:\Users\Louis\Desktop\MSTI Application\Arduino Lamp\Twitter_Scraping_Script_2.py", line 92, in get_user_tweets
    ser.write("r" + struct.pack('>B',redVal))
TypeError: must be str, not bytes

Любые идеи?

Вот мой полный код:

import tweepy 
import csv
import sys
import serial
import struct#Create Serial port object called arduinoSerialData
ser = serial.Serial("COM1", 57600)
connected = False#Twitter API credentials
consumer_key = 'xx'
consumer_secret = 'xx'
access_key = 'xx'
access_secret = 'xx'def get_user_tweets(user_name, num_tweets):
 # Open the Serial Connection
    ser.close()
    ser.open()
    loopVar = True    #authorize twitter, initialize tweepy
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_key, access_secret)
    api = tweepy.API(auth)    #initialize list to hold tweet colors
    tweets_colors = []    #Initialize string to hold current tweet
    this_tweet = ""    #Initialize string to hold current color
    this_color = ""    #Initialize tuple to hold rgb values
    rgb = ()    #Initialize list to hold rgb values
    rgb_values =[]    #Call to get access tweets from specified user
    tweets = api.user_timeline(screen_name='color_OTD',count=num_tweets)    #Create a csv file with the username of the given user
    #with open('%s_tweets.csv' % user_name, 'w', newline='') as f:        #Create writer object and give csv column names
        #writer = csv.writer(f)
        #writer.writerow(['red','green','blue'])    #Loop through all tweets accessed
    for tweet in tweets:        #If the tweet isn't a retweet
        if not tweet.retweeted:            #Get # with hex color value
            this_tweet = str(tweet.entities.get('hashtags'))            #Access hex value within hashtag string
            this_color = this_tweet[11:17]            #Append all colors to list
            tweets_colors.append(this_color)            #Convert from hex to rgb
            rgb = tuple(int(this_color[i:i+2], 16) for i in (0, 2 ,4))            #Add individual rgb values to list
            rgb_values = [rgb[0], rgb[1], rgb[2]]
            #Write rgb values to csv
            #writer.writerow(rgb_values)            print(rgb[0])
            print(type(rgb[0]))
            print(rgb[1])
            print(type(rgb[1]))
            print(rgb[2])
            print(type(rgb[2]))            if (ser.isOpen()):
            # Start a main loop
                while (loopVar):                    # Prompt for Red value
                    redVal = rgb[0]
                    print(struct.pack('>B', redVal))
                    ser.write("r" + struct.pack('>B',redVal))                    # Prompt for Green value
                    greenVal = rgb[1]
                    print(struct.pack('>B', greenVal))
                    ser.write("g" + struct.pack('>B',greenVal))                    # Prompt for Blue value
                    blueVal = rgb[2]
                    print(struct.pack('>B', blueVal))
                    ser.write("b" + struct.pack('>B',blueVal))                    # Check if user wants to end
                    loopCheck = raw_input('Loop (y/N):')
                    if (loopCheck == 'N'):
                        loopVar = False        # After loop exits, close serial connection
        ser.close()if __name__ == '__main__':
    get_user_tweets('color_OTD', 5)

0 ответов