Как сделать вывод команды OS.popen списком меню выбора?

Как сделать вывод 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 2, насколько я знаю, сам popen устарел даже в python 3. Вместо этого мы используем модуль subprocess

surge10 01.05.2018 12:47

Вам нужно серьезно подумать о переходе на Python 3, поддержка Python 2.6 закончилась много лет назад, а Python 2.7 достигнет своего официального конца в 2020 году. Но если вы в настоящее время застряли на версии 2.6, вы все равно можете использовать subprocess вместо popen.

PM 2Ring 01.05.2018 12:55

Однако ваш вопрос не совсем ясен. Вам нужно показать нам, как на самом деле выглядит вывод программы SG. Кстати, использовать input на Python 2 - не лучшая идея, это большая дыра в безопасности, используйте вместо этого raw_input.

PM 2Ring 01.05.2018 12:57

Наша компания до сих пор использует версию 2.6, обновить ее до 3 сейчас невозможно. У меня уже есть программа с os.popen для расширения этой программы, которую я должен продолжить с os.popen. Выход SG я назвал выше как тигр, лев и т. д.

kalyanyellapu 01.05.2018 13:38

Вы имеете в виду, что os.popen(SG).read() возвращает однострочную строку, например "tiger, lion, elephant, deer, pigeon, fox, hyena, leopard, cheetah, hippo"?

PM 2Ring 01.05.2018 14:08

вывод будет построчным списком. т.е. в каждой строке одно животное.

kalyanyellapu 01.05.2018 14:18
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
6
284
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Очевидно, я не могу продемонстрировать материал 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 29.03.2019 14:26

@kalyanyellapu Извините, я не могу воспроизвести вашу проблему. Код работает так, как ожидалось, на Python 3 после изменения raw_input на input.

PM 2Ring 29.03.2019 15:09

Другие вопросы по теме