TypeError:需要一个类似字节的对象,而不是使用kinit.stdin.write('%s \ n'%password)的'str'

时间:2019-02-01 12:09:29

标签: python-3.6

我正在尝试使用python从Linux计算机连接到SQL Server。但是在尝试获得kerbos票时遇到了问题。下面是我正在使用的代码。

# Login Credentials
userid = "username"
password = "password"
realm="realm.com"
kinit = '/usr/bin/kinit'

# Get Fresh Kerberos Ticket
kinit_args = [ kinit, '%s@%s' % (userid, realm) ]
kinit = Popen(kinit_args, stdin=PIPE, stdout=PIPE, stderr=PIPE)
kinit.stdin.write('%s\n' % password)
kinit.wait()

Error message displayed :
Traceback (most recent call last):
    File "poc_test1.py", line 25, in <module>
      kinit.stdin.write('%s\n' % password)
TypeError: a bytes-like object is required, not 'str'

谢谢。

1 个答案:

答案 0 :(得分:0)

您需要将write字符串编码为字节,以便python知道如何通过管道发送正确的字节。

更改行,如下所示:

kinit.stdin.write('{}\n'.format(password).encode('utf-8'))

"".format()是旧格式字符串语法的较新版本。然后,将其编码为字节,并假定密码字符串为UTF-8编码,这应该是默认值。

但是我也建议您将stdin.writewait换成新的通讯,看起来应该像这样:

kinit = Popen(kinit_args, stdin=PIPE, stdout=PIPE, stderr=PIPE)
kinit.communicate(input="{}\n".format(password).encode("utf-8"))