Как сделать вывод os.popen списком пунктов меню выбора, которые будут использоваться в качестве входных данных для другой программы?
Примечание. Каждый раз, когда вывод меняется, мы не можем определить одно постоянное меню выбора. Это может быть больше 10, а иногда и меньше 10 элементов.
SG = "dzdo symaccess -sid {0} show {1} view -detail"
IG = os.popen SG).read()
print SG
Выше показана программа, если вывод SG содержит около десяти элементов, как показано ниже:
tiger
lion
elephant
deer
pigeon
fox
hyena
leopard
cheatah
hippo
Вышеупомянутые элементы я хочу выбрать из следующих элементов:
print("1. tiger")
print("2. lion")
print("3. elephant")
print("4. deer")
.
.
.
print("11. exit")
print ("\n")
choice = input('enter your choice [1-11] :')
choice = int(choice)
if choice ==1:
...
Итак, как нам добавить каждый элемент в каждый оператор печати и сделать так, чтобы у него была возможность выбора, и как мы можем узнать количество элементов и сделать такое же количество вариантов в меню?
Вам нужно серьезно подумать о переходе на Python 3, поддержка Python 2.6 закончилась много лет назад, а Python 2.7 достигнет своего официального конца в 2020 году. Но если вы в настоящее время застряли на версии 2.6, вы все равно можете использовать subprocess вместо popen.
Однако ваш вопрос не совсем ясен. Вам нужно показать нам, как на самом деле выглядит вывод программы SG. Кстати, использовать input на Python 2 - не лучшая идея, это большая дыра в безопасности, используйте вместо этого raw_input.
Наша компания до сих пор использует версию 2.6, обновить ее до 3 сейчас невозможно. У меня уже есть программа с os.popen для расширения этой программы, которую я должен продолжить с os.popen. Выход SG я назвал выше как тигр, лев и т. д.
Вы имеете в виду, что os.popen(SG).read() возвращает однострочную строку, например "tiger, lion, elephant, deer, pigeon, fox, hyena, leopard, cheetah, hippo"?
вывод будет построчным списком. т.е. в каждой строке одно животное.






Очевидно, я не могу продемонстрировать материал popen, поэтому я жестко закодировал входные данные в многострочную строку, которую я превращаю в список с помощью метода .splitlines. Этот код справится с данными любого размера, он не ограничен 10 элементами.
Он выполняет некоторую примитивную проверку ввода пользователя, реальная программа должна отображать более полезное сообщение, чем «Плохой выбор».
from __future__ import print_function
IG = '''\
tiger
lion
elephant
deer
pigeon
fox
hyena
leopard
cheatah
hippo
'''
data = IG.splitlines()
for num, name in enumerate(data, 1):
print('{0}: {1}'.format(num, name))
exitnum = num + 1
print('{0}: {1}'.format(exitnum, 'exit'))
while True:
choice = raw_input('Enter your choice [1-{0}] : '.format(exitnum))
try:
choice = int(choice)
if not 1 <= choice <= exitnum:
raise ValueError
except ValueError:
print('Bad choice')
continue
if choice == exitnum:
break
elif choice == 1:
print('Tigers are awesome')
else:
print('You chose {0}'.format(data[choice-1]))
print('Goodbye')
демонстрационный вывод
1: tiger
2: lion
3: elephant
4: deer
5: pigeon
6: fox
7: hyena
8: leopard
9: cheatah
10: hippo
11: exit
Enter your choice [1-11] : 3
You chose elephant
Enter your choice [1-11] : c
Bad choice
Enter your choice [1-11] : 1
Tigers are awesome
Enter your choice [1-11] : 12
Bad choice
Enter your choice [1-11] : 4
You chose deer
Enter your choice [1-11] : 11
Goodbye
Проверено на Python 2.6.6. Этот код также будет правильно работать на Python 3, вам просто нужно изменить raw_input на input для Python 3. Но пожалуйста не использует input на Python 2.
когда я использовал тот же скрипт в python 3.5, я получаю только последний, то есть только бегемота, и выхожу из меню выбора. В 3.5.2 мне нужно что-то менять. Я изменил raw_input на ввод в 3.5.2
@kalyanyellapu Извините, я не могу воспроизвести вашу проблему. Код работает так, как ожидалось, на Python 3 после изменения raw_input на input.
Да, почему вы все еще используете python 2, насколько я знаю, сам popen устарел даже в python 3. Вместо этого мы используем модуль subprocess