无法从b'0 \ n'转换int

时间:2014-12-09 10:43:48

标签: python casting int byte paramiko

我使用paramiko ssh在远程计算机上运行cat /tmp/file,该计算机包含一位数字。

此数字需要与0进行比较。

stdin, stdout, stderr = client.exec_command('cat /tmp/file')
print("stdout:")
print(stdout)
print("\nstdout.read():")
print(stdout.read())
print("\nif not int(errlvl) == 0:")
errlvl = stdout.read()
if not int(errlvl) == 0:

输出:

stdout:
<paramiko.ChannelFile from <paramiko.Channel 35 (open) window=2097152 -> <paramiko.Transport at 0x2b36750 (cipher aes128-ctr, 128 bits) (active; 1 open channel(s))>>>

stdout.read():
b'0\n'

int(stdout.read())
Traceback (most recent call last):
[...]
    if not int(errlvl) == 0:
ValueError: invalid literal for int() with base 10: b''

如何在我的int中使用0值,在本例中为if

3 个答案:

答案 0 :(得分:3)

代码两次调用stdout.read;导致第二次读取返回空字节。

读取一次并将其存储在某处,然后重复使用。

stdin, stdout, stderr = client.exec_command('cat /tmp/file')
print("stdout:")
print(stdout)
print("\nstdout.read():")
errlvl= stdout.read()  # <-----
print(errlvl)
print("\nif not int(errlvl) == 0:")
if not int(errlvl) == 0:
    ...

答案 1 :(得分:1)

此:

stdout.read()

会得到你b'0\n';但 second stdout.read()会为您提供一个空字符串,因为第一个read()已经读取了0read()从一开始就没有读过,但是它最后一次离开了。

这也是错误所说的:

invalid literal for int() with base 10: b''

b'',而不是b'0\n

所以您需要做的就是调用read()一次,然后立即将其存储在变量中。

答案 2 :(得分:1)

您正在从stdout读取两次,从而使第二次读取为空而不是您预期的“0 \ n”值。这样做:

stdin, stdout, stderr = client.exec_command('cat /tmp/file')
print("stdout:")
print(stdout)
print("\nstdout.read():")
errlvl = stdout.read()
print(errlvl)
print("\nif not int(errlvl) == 0:")
if not int(errlvl) == 0: