Attempted to login using python3 on existing client and got the traceback: /usr/lib/python3/dist-packages/launchpadlib/credentials.py in from_string(cls, query_string) 249 """Create and return a new `AccessToken` from the given string.""" 250 params = cgi.parse_qs(query_string, keep_blank_values=False) --> 251 key = params['oauth_token'] 252 assert len(key) == 1, ( 253 "Query string must have exactly one oauth_token.") KeyError: 'oauth_token' Upgraded to: Get:1 http://archive.ubuntu.com/ubuntu xenial-proposed/main amd64 python3-launchpadlib all 1.10.3-3ubuntu0.1 [36.5 kB] And that traceback is gone. However, keyring integration is still broken: In [1]: from launchpadlib.launchpad import Launchpad In [2]: lp = Launchpad.login_with('just testing', 'production', version='devel') The authorization page: (https://launchpad.net/+authorize-token?oauth_token=G81S4r3H7ppz29Zr4z6r&allow_permission=DESKTOP_INTEGRATION) should be opening in your browser. Use your browser to authorize this program to access Launchpad on your behalf. Waiting to hear from Launchpad about your decision... --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) in () ----> 1 lp = Launchpad.login_with('just testing', 'production', version='devel') /usr/lib/python3/dist-packages/launchpadlib/launchpad.py in login_with(cls, application_name, service_root, launchpadlib_dir, timeout, proxy_info, authorization_engine, allow_access_levels, max_failed_attempts, credentials_file, version, consumer_name, credential_save_failed, credential_store) 542 cache_path, timeout, proxy_info, authorization_engine, 543 allow_access_levels, credential_store, --> 544 credential_save_failed, version) 545 546 @classmethod /usr/lib/python3/dist-packages/launchpadlib/launchpad.py in _authorize_token_and_login(cls, consumer_name, service_root, cache, timeout, proxy_info, authorization_engine, allow_access_levels, credential_store, credential_save_failed, version) 349 # They're not there. Acquire new credentials using the 350 # authorization engine. --> 351 credentials = authorization_engine(credentials, credential_store) 352 else: 353 # We acquired credentials. But, the application name /usr/lib/python3/dist-packages/launchpadlib/credentials.py in __call__(self, credentials, credential_store) 550 return None 551 # save() invokes the callback on failure. --> 552 credential_store.save(credentials, self.unique_consumer_id) 553 return credentials 554 /usr/lib/python3/dist-packages/launchpadlib/credentials.py in save(self, credentials, unique_consumer_id) 305 except Exception as e: 306 if self.credential_save_failed is None: --> 307 raise e 308 self.credential_save_failed() 309 return credentials /usr/lib/python3/dist-packages/launchpadlib/credentials.py in save(self, credentials, unique_consumer_id) 300 """ 301 try: --> 302 self.do_save(credentials, unique_consumer_id) 303 except EXPLOSIVE_ERRORS: 304 raise /usr/lib/python3/dist-packages/launchpadlib/credentials.py in do_save(self, credentials, unique_key) 382 serialized = self.B64MARKER + b64encode(serialized) 383 keyring.set_password( --> 384 'launchpadlib', unique_key, serialized) 385 386 def do_load(self, unique_key): /usr/lib/python3/dist-packages/keyring/core.py in set_password(service_name, username, password) 46 """Set password for the user in the specified service. 47 """ ---> 48 _keyring_backend.set_password(service_name, username, password) 49 50 /usr/lib/python3/dist-packages/keyring/backends/file.py in set_password(self, service, username, password) 85 86 # encrypt the password ---> 87 password_encrypted = self.encrypt(password.encode('utf-8')) 88 # encode with base64 89 password_base64 = base64.encodestring(password_encrypted).decode() AttributeError: 'bytes' object has no attribute 'encode'