2014-12-09 2 views
0

paramiko ssh를 사용하여 cat /tmp/file을 하나의 숫자가 포함 된 원격 컴퓨터에서 실행합니다.b'0에서 int를 전송할 수 없습니다. n '

이 숫자는 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'' 

가 어떻게이 경우 0에서 int 값을 사용할 수 있습니다, 내 if에?

+2

'b'0 \ n' '이 아니며'b ''가 비어 있습니다. 'int (b'0 \ n ')'이 작동합니다. – wim

+0

당신은 옳은 것을 인쇄하지 않습니다. 'print errlvl' –

+2

'stdout.read()'는 파일 포인터를 움직이는데, 다시 호출하면 아무것도 얻지 못합니다. – tamasgal

답변

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

이 :

stdout.read() 

당신에게 b'0\n'를 얻을 것이다; 두 번째stdout.read()은 첫 번째 read()이 이미 0을 읽었 기 때문에 빈 문자열을 표시합니다. read()은 처음부터 읽지 않지만 마지막으로 읽은 곳은 읽습니다.

이 오류의 말씀도 :

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

b''하지 b'0\n.

그래서해야 할 일은 read()을 한 번 호출하고 바로 변수에 저장하는 것입니다.

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: 
관련 문제