Python Interactive Shell Type Application - PullRequest
       5

Python Interactive Shell Type Application

5 голосов
/ 18 февраля 2012

Я хочу создать интерактивное приложение типа оболочки. Например:

> ./app.py

Enter a command to do something. eg `create name price`. 
For to get help, enter "help" (without quotes)

> create item1 10
Created "item1", cost $10

> del item1
Deleted item1

> exit 
...

Конечно, я мог бы использовать бесконечный цикл для получения пользовательского ввода, разделив строку, чтобы получить отдельные части команды, но есть ли лучший способ? Даже в PHP (Symfony 2 Console) они позволяют создавать консольные команды, например, для настройки веб-приложений. Есть ли что-то подобное в Python (я использую Python 3)

Ответы [ 3 ]

10 голосов
/ 18 февраля 2012

Просто input команды в цикле.

Для синтаксического анализа ввода, shlex.split - хороший вариант. Или просто идти с простой str.split.

import readline
import shlex

print('Enter a command to do something, e.g. `create name price`.')
print('To get help, enter `help`.')

while True:
    cmd, *args = shlex.split(input('> '))

    if cmd=='exit':
        break

    elif cmd=='help':
        print('...')

    elif cmd=='create':
        name, cost = args
        cost = int(cost)
        # ...
        print('Created "{}", cost ${}'.format(name, cost))

    # ...

    else:
        print('Unknown command: {}'.format(cmd))

Библиотека readline добавляет функции истории (стрелка вверх) и многое другое. Интерактивная оболочка Python использует его.

2 голосов
/ 09 декабря 2017

Еще один подход к созданию таких интерактивных приложений - использование модуля cmd .

# app.py
from cmd import Cmd

class MyCmd(Cmd):

    prompt = "> "

    def do_create(self, args):
        name, cost = args.rsplit(" ", 1) # args is string of input after create
        print('Created "{}", cost ${}'.format(name, cost))

    def do_del(self, name):
        print('Deleted {}'.format(name))

    def do_exit(self, args):
        raise SystemExit()

if __name__ == "__main__":

    app = MyCmd()
    app.cmdloop('Enter a command to do something. eg `create name price`.')

А вот результат выполнения вышеуказанного кода (если указанный код был в файле с именем app.py):

$ python app.py
Enter a command to do something. eg `create name price`.
> create item1 10
Created "item1", cost $10
> del item1
Deleted item1
> exit
$
0 голосов
/ 18 февраля 2012

Вы можете начать с взгляда на argparse .

Он не предоставляет полную интерактивную оболочку, как вы просите, но он помогает в создании функциональности, подобной вашему примеру PHP.

...