使用API验证函数thows TypeError从2.7转换为Python3.3代码

使用API验证函数thows TypeError从2.7转换为Python3.3代码,python,typeerror,argparse,Python,Typeerror,Argparse,是什么导致了打字错误?我不知所措。下面是我的代码。我已经调试过了。正如你看到的打印行,身份验证码不是我的,它是从一个不在这里的同事那里借来的。这些代码都不应该是机密的,大部分是通用的,但我以前从未遇到过这种情况。它正在获取一个字符串并期望字节码 #! /bin/python3.3/ import argparse import configparser import getpass import sys import urllib from lxml import objectify, etre

是什么导致了打字错误?我不知所措。下面是我的代码。我已经调试过了。正如你看到的打印行,身份验证码不是我的,它是从一个不在这里的同事那里借来的。这些代码都不应该是机密的,大部分是通用的,但我以前从未遇到过这种情况。它正在获取一个字符串并期望字节码

#! /bin/python3.3/
import argparse
import configparser
import getpass
import sys
import urllib
from lxml import objectify, etree
import json
from xml.etree import ElementTree as ET

#""" start authentication """
sys.path.append("Lib")
from vCloudSessionObj import vCloudSessionObj
from vCloudRequestObj import vCloudRequestObj

def get_parser():
    parser = argparse.ArgumentParser()
    parser.add_argument('-H', '--hostname')
    #print("-h")
    parser.add_argument('-u', '--username')
    #print("-u")
    parser.add_argument('-o', '--organization', required=True)
    #print("-o")
    return parser
#print("into parser")

#python

if __name__ == '__main__':
    args = get_parser().parse_args()
    sessionObj = vCloudSessionObj( args.hostname,args.username,getpass.getpass(), args.organization)
    validity = sessionObj.is_valid()
    if validity is False:
        print("Login Failed")
        sys.exit()

    requestObj = vCloudRequestObj(sessionObj)

    QueryResultRecords = requestObj.get('/api/admin/extension/vapps/query')



#"""start new process... create new vApp"""
def getcatalog():

        GET /catalogs/query # this will make a list of catalogues to choose from

        catalogID = raw_input("please enter the catalogue id: ") #"""for inputting the catalog id"""

        #"""makes use of the catalogID variable from the raw input and gets the selected catalogue"""
        GET /catalog/catalogID


def GetNewVapp():

        vappID = raw_input("please enter the vApp ID: ") #"""for inputting the vApp ID"""
        POST /vApp/vappID/action/deploy         #"""api call to deploy the catalogued vApp ID"""
它为此输出:

[root@64-CentOS-2 Python-3.3.0]# python3.3 deployVapp.py -H host -u myname -o myorg
into parser
-h
-u
-o
Password:
Traceback (most recent call last):
  File "deployVapp.py", line 31, in <module>
    sessionObj = vCloudSessionObj( args.hostname,args.username,getpass.getpass(), args.organization)
  File "Lib/vCloudSessionObj.py", line 15, in __init__
    self.auth_token = self.initialize_auth_token(hostname, username, password, organization)
  File "Lib/vCloudSessionObj.py", line 44, in initialize_auth_token
    username, organization, password))
  File "/usr/local/lib/python3.3/base64.py", line 58, in b64encode
    raise TypeError("expected bytes, not %s" % s.__class__.__name__)
TypeError: expected bytes, not str
[root@64-CentOS-2 Python-3.3.0]35; python3.3 deployVapp.py-H host-u myname-o myorg
进入解析器
-h
-u
-o
密码:
回溯(最近一次呼叫最后一次):
文件“deployVapp.py”,第31行,在
sessionObj=vCloudSessionObj(args.hostname,args.username,getpass.getpass(),args.organization)
文件“Lib/vCloudSessionObj.py”,第15行,在__
self.auth\u token=self.initialize\u auth\u token(主机名、用户名、密码、组织)
文件“Lib/vCloudSessionObj.py”,第44行,在initialize_auth_令牌中
用户名、组织、密码)
b64encode中的文件“/usr/local/lib/python3.3/base64.py”,第58行
raise TypeError(“应为字节,而不是%s”%s.\u类\u名称\u)
TypeError:应为字节,而不是str

Python 3中的字符串是Unicode字符串(Unicode代码点序列)<代码>字节是一个字节序列(整数0..255)


expected bytes,not str
错误消息意味着在调用
b64encode()
函数之前,应该将
initialize\u auth\u token()
方法更改为将Unicode文本编码为字节。

应该做什么?我没有看到任何可能引入带有奇怪的重载除法运算符的
GET
对象的东西。你确定没有将伪代码复制/粘贴到你的程序中吗?我在Google上没有看到任何关于
vCloudSessionObj
的点击,所以这看起来像是你组织内部的东西。看起来要么您将错误的参数传递给了它的构造函数,要么它没有针对Python3进行正确的更新。一些
str
需要
字节
;在Python2中,这些都是相同的类型,但是
str
现在是unicode。而且,
raw\u input
在Python3.x中不存在,您永远不应该测试
validity is False
(使用
not validity
)之类的东西,并且您可能希望以错误状态退出(例如
sys.exit(1)
)也许打印一些东西,而不是成功地默默存在。身份验证脚本不是我写的,而是同事写的。我只是负责把它升级到3.x版本,这些信息非常有用。vCloudSessionObj是内部编写的,但它使用第三方库。GET调用是对VMware的Vitural Cloud Director(VCD)API的调用,vCloudSessionObj为该API初始化身份验证。这里的目标是将目录中的vApp发布到VCD中。不幸的是,我无法提供vCloudSessionObj,因为它包含专有/受保护的信息。非常感谢,我明天将对此进行测试,看看它是如何工作的。我会让你知道事情的进展,所以我终于明白了。在vCloudSessionObj.py中,我必须找到它格式化凭证的位置,并将函数内部的if调用转换为字节码。谢谢你的帮助,这无疑让我走上了正确的道路。@castaway2000:(有java字节码、python字节码(查看
.pyc
文件内部)等)。别把它和“字节”这个词混淆了。哦,谢谢你纠正了我对单词的使用。我以后一定要把它们区分开来。现在我要去做一些API工作。再次感谢您对代码的帮助。