Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python TypeError-无法将“User”对象隐式转换为str_Python_Python 3.x_Typeerror - Fatal编程技术网

Python TypeError-无法将“User”对象隐式转换为str

Python TypeError-无法将“User”对象隐式转换为str,python,python-3.x,typeerror,Python,Python 3.x,Typeerror,我有一个在Python2.7上运行得很好的代码,但后来我迁移到Python3.5,它不再工作了,我遇到了一个错误。 代码如下: def gen_cert(keyname, certname, password, username): cmd = [ 'openssl', 'pkcs12', '-name', username, '-inkey', tempdirname + keyname, '-in', tempdirname + certname, '-export', '-

我有一个在Python2.7上运行得很好的代码,但后来我迁移到Python3.5,它不再工作了,我遇到了一个错误。 代码如下:

def gen_cert(keyname, certname, password, username):
cmd = [
    'openssl', 'pkcs12', '-name', username, '-inkey', tempdirname + keyname,
    '-in', tempdirname + certname, '-export', '-out',
    dirname + username + '.p12', '-password', 'pass:' + password
]
s = subprocess.Popen(cmd, shell=False)
out, err = s.communicate('\n'.encode())
错误是-无法将“User”对象隐式转换为str

由于此目录名+用户名+'.p12'而出现错误

以下是局部变量:

| Variable | Value           |
______________________________
| certname |'w0ui8t9mkg.pem' |
| keyname  |'7g89utc1it.pem' |
| password |'bo02qm99ui'     |
| username |<User: abcuser>|
另外,我在allusers=','中得到一个错误。joinUsersList 这表示序列项0:应为str实例,用户已找到

如何解决? 我正在使用django 2.0

简要建议: 发生的事情是qs.username指向一个用户对象,但您希望它指向一个字符串,即该用户对象的用户名。除了下面的修复之外,我建议您尝试更改queryset中的密钥。现在,您的关键用户名指向的不是用户名的东西,这令人困惑,尽管您不需要这样做来让代码工作;这只是一个风格上的建议

如何解决错误: 假设您使用的是默认的Django.contrib.auth用户模型,则可以使用User.get\u username访问用户名。我之前推荐的strusername方法也可以使用,因为它调用User对象上的_ustr_u函数,默认情况下返回用户名。在调用gen_cert时,最好调用任一方法,方法是将username变量设置为:

username = qs.username.get_username()


关于allusers=','.joinUsersList的第二个问题,我认为您也遇到了同样的问题,一旦username变量实际指向字符串而不是用户对象,这个问题就会得到解决。

这看起来像是数据类型错误或问题。您视为字符串类型的项实际上存储为对象类型。找出数据类型,然后适当地处理它。您需要转换类型。将用户名转换为字符串,然后再将其读入代码中的cmd行

我认为这一行代码需要更改: cmd=['some content here',dirname+username+'.p12']

class str(object='')
class str(object=b'', encoding='utf-8', errors='strict')
返回对象的字符串版本。如果未提供对象,则返回空字符串。否则,str的行为取决于是否给出了编码或错误,如下所示

如果既不提供编码也不提供错误,strobject将返回object.str,这是对象的“非正式”或可良好打印的字符串表示形式。对于字符串对象,这是字符串本身。若对象并没有str方法,那个么str会返回reprobject

如果至少给出了一个编码或错误,则对象应该是类似字节的对象,例如bytes或bytearray。在这种情况下,如果对象是bytes或bytearray对象,则strbytes,encoding,errors等同于bytes.decodeCoding,errors。否则,将在调用bytes.decode之前获取缓冲区对象下的bytes对象。有关缓冲区对象的信息,请参见二进制序列类型-字节、bytearray、memoryview和缓冲区协议

在不使用encoding或errors参数的情况下将bytes对象传递给str属于返回非正式字符串表示的第一种情况,另请参见Python的-b命令行选项。例如:

str(b'Zoot!')
"b'Zoot!'"
有关str类及其方法的更多信息,请参阅下面的文本序列类型-str和字符串方法部分。要输出格式化字符串,请参阅格式化字符串文字和格式化字符串语法部分。此外,请参阅文本处理服务部分

str.format*args,**kwargs

执行字符串格式化操作。调用此方法的字符串可以包含由大括号{}分隔的文本或替换字段。每个替换字段包含位置参数的数字索引或关键字参数的名称。返回字符串的副本,其中每个替换字段都替换为相应参数的字符串值

"The sum of 1 + 2 is {0}".format(1+2)
'The sum of 1 + 2 is 3'
以下3页中的信息应有帮助:

来自塞巴斯蒂安·拉什卡的网站:

统一码 Python2有ASCII str类型,单独的unicode,但没有字节类型。在您的例子中,您过去用作字符串的内容现在被视为对象

Python3具有Unicode utf-8字符串和2个字节类:byte和ByteArray

Python 2:

In:  print 'they are really' + b' the same'
Out: they are really the same
Python 3:

IN:  print('and Python', python_version(), end="")
IN:  print(' also has', type(bytearray(b'bytearrays')))
OUT: and Python 3.4.1 also has <class 'bytearray'>

'note that we cannot add a string' + b'bytes for data'


 ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)

    <ipython-input-13-d3e8942ccf81> in <module>()
    ----> 1 'note that we cannot add a string' + b'bytes for data'



    TypeError: Can't convert 'bytes' object to str implicitly
来自Geeksforgeks:

Unicode:

在Python 2中,隐式str类型是ASCII。但在Python3.x中,隐式str类型是Unicode

print(type('default string '))
print(type(b'string with b '))

'''
Output in Python 2.x (Bytes is same as str)
<type 'str'>
<type 'str'>

Output in Python 3.x (Bytes and str are different)
<class 'str'>
<class 'bytes'>
'''

您正在尝试连接两个对象,但其中至少有一个不是str类型,您应该实现User类的uuu str_uuuu方法,在该方法中返回表示类的值,以便您可以按希望的方式将其连接到dirname+strusername,并调用用户名。uuu str_u方法

更改此方法时,两个错误都得到解决:

for qs in queryset:
        username = qs.username
为此:

for qs in queryset:
        username = str(qs.username)
这不是username=qs.username使用username=strqs.username,而是将username转换为str,因此没有c 在调用gen_cert函数后的后期需要onversion

因此,这有助于解决这两个错误


谢谢大家的回答和建议,他们帮了大忙:

我猜用户名是用户对象?显示代码whre is username是用户名Yes username是用户对象。你能包括调用gen_cert函数的代码吗?如果可能的话,还可能是用户类的代码。@RishabhChaudhary我更新了Django 2.0的答案,不过在代码中查看调用gen_cert的位置仍然会有所帮助。这是python,所以我知道这不是编译时错误;如果username是一个字节数组,那么我认为它可以转换成一个字符串:username=username。按照你的建议解码“ASCII”,我使用了strusername,它可以工作。但我在这里使用过:对于queryset中的qs:username=strqs.username keyname=random_name.pem'certname=random_name.pem'password=random_name gen_certkeyname,certname,password,username这甚至解决了第二个错误。啊,好吧,我想strUser确实返回了用户对象的用户名。我很高兴知道您已经解决了这些错误:我要添加的一件小事是,现在,您的变量qs.username,也就是说,与queryset中每个元素相关联的username条目实际上指向一个用户对象,严格来说,它不是一个用户名,username是一个字符串,它只是每个用户对象具有的一个属性。这只是一个风格问题,但如果我在写这段代码,我会担心如果我的关键用户名指向用户对象,我会感到困惑。@RishabhChaudhary我更新了我的答案,以反映您对问题所做的更改,以防将来有人引用此问题。如果您认为我的答案正确解决了您的问题,请将其标记为已接受,这将标记此问题为已解决,并帮助未来用户,并给我代表分数:。如果没有,请随时回复这些评论。
for qs in queryset:
        username = qs.username
for qs in queryset:
        username = str(qs.username)