Самое первое, что бросило меня в цикл (не каламбур), было то, что вы ограничивали значение 1-13, когда ему нужно быть 0-52. Также с вашей логикой значение всегда было выше. Лучший подход - это генератор чисел. Вот мой код с использованием генератора чисел (или Java Random):
public static void main(String[] args) {
String[] cards = { "Ace of Clubs", "1 of Clubs", "2 of Clubs",
"3 of Clubs", "4 of Clubs", "5 of Clubs", "6 of Clubs",
"7 of Clubs", "8 of Clubs", "9 of Clubs", "10 of Clubs",
"Queen of Clubs", "King of Clubs", "Ace of Diamonds",
"1 of Diamonds", "2 of Diamonds", "3 of Diamonds",
"4 of Diamonds", "5 of Diamonds", "6 of Diamonds",
"7 of Diamonds", "8 of Diamonds", "9 of Diamonds",
"10 of Diamonds", "Queen of Diamonds", "King of Diamonds",
"Ace of Hearts", "1 of Hearts", "2 of Hearts", "3 of Hearts",
"4 of Hearts", "5 of Hearts", "6 of Hearts", "7 of Hearts",
"8 of Hearts", "9 of Hearts", "10 of Hearts",
"Queen of Hearts", "King of Hearts", "Ace of Spades",
"1 of Spades", "2 of Spades", "3 of Spades", "4 of Spades",
"5 of Spades", "6 of Spades", "7 of Spades", "8 of Spades",
"9 of Spades", "10 of Spades", "Queen of Spades",
"King of Spades" };
Scanner scanner = new Scanner(System.in);
Random rand = new Random();
String response = "";
int index = 0;
int value = 0;
while (!response.equals("q") && index < 52) {
// set next card value based on current set of cards in play
if (cards[index].endsWith("Clubs")) {
value = rand.nextInt(12);
}
if (cards[index].endsWith("Diamonds")) {
value = rand.nextInt(12) + 13;
}
if (cards[index].endsWith("Hearts")) {
value = rand.nextInt(12) + 26;
}
if (cards[index].endsWith("Spades")) {
value = rand.nextInt(12) + 39;
}
// display card too user (NOTE: we use the random number not the index)
System.out.println("Card is: " + cards[value]);
// ask user what well the next card be
System.out.println("Will the next card be higher or lower?, press q if you want to quit");
response = scanner.nextLine();
// display if user was right (NOTE: compared the random number to the current index)
// ignore incorrect response and just continue
if ((value > index && response.startsWith("h")) || (value < index && response.startsWith("l"))) {
System.out.println("You answer was right, well done!");
} else {
System.out.println("You answer was wrong, try again!");
}
// continue loop
index++;
}
}
Что касается исключения NumberFormatException, я считаю, что Николас Филотто хорошо объяснил это.
Для вашего второго вопроса: хотя я не специалист по paramiko, я вижу, что функция recv, в соответствии с doc , возвращает строку. Если вы примените цикл for к строке, вы получите символы (а не строки, как можно было бы ожидать). Новая строка вызвана использованием вами функции печати, как описано на этой странице, в пункте 6.3 .
Я не изучил, что предлагает парамико. Но почему вы не относитесь к полной строке как к единому объекту? Например, вы можете проверить наличие «вверх» как:
if "up" in output:
Или, если это лучше подходит вашим потребностям, вы можете разделить строку на строки , а затем сделать любой тест, который вы хотите сделать:
for line in output.split('\n'):
После прочтения всего комментария я сделал следующие изменения:
#!/usr/bin/env python
import paramiko, time
router = 'r2.test.example.com'
password = 'password'
username = 'testuser'
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(router, username=username, password=password)
print('Successfully connected to %s' % router)
remote_conn = ssh.invoke_shell()
output = remote_conn.recv(1000)
# Disable paging on Brocade.
remote_conn.send('terminal length 0\n')
time.sleep(2)
# Clearing output.
if remote_conn.recv_ready():
output = remote_conn.recv(1000)
# Check interface status.
remote_conn.send('show interfaces ethernet 4/1\n') # I only want output from this command.
time.sleep(2)
# Getting output I want.
if remote_conn.recv_ready():
output = remote_conn.recv(5000)
print(output)
# Test: Check if interface is up.
for line in output.split('\n'):
if 'line protocol is up' in line:
print(line)
Теперь все отлично работает.
Спасибо за помощь.
С наилучшими пожеланиями,
Aaron C.
Если вы можете, вызов exec_command()
предоставляет более простой механизм для вызова команды. Я видел, что коммутаторы Cisco резко отключают подключения, которые пытаются использовать exec_command()
, поэтому их нельзя использовать с устройствами Brocade.
Если вы должны пойти по маршруту invoke_shell()
, обязательно очистите все ожидающие выходные данные после подключения и после send('terminal length 0\n')
, проверяя recv_ready()
перед вызовом recv()
, чтобы избежать блокировки при чтении данных, которые, возможно, никогда не были получены. Поскольку вы контролируете интерактивную оболочку, могут потребоваться вызовы sleep()
, чтобы дать серверу достаточное время для обработки и отправки данных, или, возможно, потребуется опросить строку вывода, чтобы подтвердить, что ваша последняя команда завершена путем распознавания строки приглашения оболочки .