Как настроить iPython как упрощенную командную оболочку для обычного пользователя

Резюме. Можно ли настроить iPython так, чтобы обычный пользователь выглядел как простой терминал командной строки dos/bash (cd, ls, mkdir, rm... и т. д.), а затем предоставить несколько дополнительных проприетарные команды?

Подробно: я работаю в компании, выпускающей видеоигры, пользователи которой никогда не сталкивались с "хорошим" интерфейсом командной строки в производственном конвейере. Итак, в ответ я некоторое время работал над написанием CLI с использованием cmd.py в python, воссоздавая часто используемые команды dos, а затем дополняя их своими собственными пользовательскими командами, чтобы делать различные вещи, например: быстро переходить через предопределенные производственные папки , упрощенные команды управления perforce, поиск/импорт файлов с рекурсивными паттернами ant-glob в наш инструмент разработки... и т.д. и т.п...

В середине процесса я наткнулся на ipython. Я не очень знаком с ним, но я уже чувствую, что это то, что я должен использовать, так как он делает многое из того, что мне нужно, бесплатно. Он отлично обрабатывает цвета ansi. Все команды оболочки доступны через "!", можно использовать "|,>,‹" и все встроенные функции оболочки бесплатно, преимущества продолжаются и продолжаются...

Одно предостережение заключается в том, что мою целевую аудиторию легко запугать CLI... и поэтому, когда они вводят «more textfile.txt» в качестве входных данных, они ожидают поведения DOS по умолчанию для печати содержимого файла, а не:

In [42]: more textfile.txt
  File "<ipython-input-42-e442b4ca857b>", line 1
    more file.txt
            ^
SyntaxError: invalid syntax

Конечно, «!more textfile.txt» сделает то, что они ожидают, но я не хочу, чтобы им приходилось набирать «!» практически для 95% команд, которые они будут использовать.

Поэтому я ищу способ запустить ipython полностью упрощенным способом, где в моем идеальном (возможно, фантастическом) мире:

  • Все команды оболочки (cd, ls/dir, mkdir, more, rm/del и т. д.) будут доступны на переднем плане без каких-либо "!"
  • Все команды python (import, def, class, for, print, while и т. д.) будут недоступны, за исключением нескольких предопределенных проприетарных команд для выполнения различных конвейерных операций, может быть, оставить доступными основные арифметические команды?

И в качестве бонуса: способ чередовать ipython по умолчанию и очень сдержанную и упрощенную версию замены командной оболочки, о которой я мечтаю... например: ввод "normal" восстановит все поведение ipython по умолчанию... и ввод "cli "вернутся к упрощенной версии.

Последнее примечание: то, что я ищу, скорее всего, является дурацкой затеей, и мне, вероятно, следует придерживаться запуска python.exe в командной оболочке с помощью моего собственного неуклюжего сценария CLI и положить этому конец... Но Я подумал, что если то, что я хочу, чтобы iPython сделал здесь, возможно удаленно, Stackoverflow — это то место, где я быстро получу ответ :)


person Fnord    schedule 17.12.2013    source источник
comment
Мне кажется, что вы хотите написать свою собственную оболочку, которая имеет определенные функции, которые вам нужны, а не другие? Ipython может быть хорошим кодом шаблона для этого.   -  person aestrivex    schedule 18.12.2013
comment
Есть ли что-то еще, кроме !, что вы не хотите отображать в своем CLI? Кроме того, исключение этого специального индикатора того, что вы вводите команду, может наложить некоторые ограничения на именование объектов (файлов, функций и т. д.).   -  person Aleksander Lidtke    schedule 18.12.2013
comment
взгляните на %alias. Введите %rehashx, тогда у вас есть все двоичные файлы на вашем пути, ну, псевдонимы и команды, такие как more file.txt, просто работают.   -  person Fredrik Pihl    schedule 18.12.2013


Ответы (2)


IPython используется, чтобы иметь что-то близкое к тому, что вы просите, он был удален в версии 0.11 из-за отсутствия использования/тестирования и интереса. Я полагаю, что вернуть его можно, но я не уверен, сколько работы потребуется, зная, что архитектура сильно изменилась.

Я подчеркну некоторые причины, по которым вы можете захотеть/не захотеть идти по этому пути, а также некоторые альтернативные и технические моменты.

  1. вы никогда не получите полноценной реальной оболочки с IPython, вы всегда будете сталкиваться с вещами, которые не будут работать (например, getpass в двухпроцессной архитектуре или команда с тире в них)
  2. предотвратить полное использование Python будет очень сложно.
  3. определить свои собственные команды с помощью псевдонима или магии очень просто. (уже указано в комментарии
    , но не всегда работает

То, как работает сам IPython, выглядит так, что что-то существует, является действительным python, если это так, выполните. В противном случае предположим, что это волшебство, если оно имеет смысл, преобразуйте его в синтаксис Python и выполните. Затем вернитесь к псевдонимам. Я думаю, логику можно изменить, но определить, является ли что-то действительной оболочкой, может быть сложно.

Вы также можете подключить свой собственный преобразователь ввода, который SageMath делает в некоторых местах, чтобы разрешить пользовательский синтаксис.

Я не уверен, что часть «изменения» будет легкой, но IPython действительно гибок, входной преобразователь - это основа сопрограммы, поэтому он должен быть модифицируемым в реальном времени, но, вероятно, потребуется изменить в самом IPython, я думаю, чтобы выставить правильный API.

Возможно, вам будет интересно посмотреть на написание полного «ядра» IPython (не бойтесь, это проще, чем выглядит). То есть только та часть, которая получает пользовательский ввод и отправляет обратно вывод, остальное предоставляется бесплатно. Если вы посмотрите на IJulia и запустите ipython console --profile=julia, вы попадете в оболочку julia. и вы можете сделать то же самое для ruby и Haskell ...и т.д. Другие преимущества заключаются в том, что вам не нужно писать ядро ​​​​на python, и что оно будет работать на полке с qtconsole, ноутбуком, emacs, vim... и другими интерфейсами IPython.

Я вижу, что за вопрос проголосовали 3 раза, я добавлю, что IPython является открытым исходным кодом, и если люди придут, верните функциональность и помогите нам поддерживать ее, мы, вероятно, сможем добавить ее обратно в ядро.

person Matt    schedule 18.12.2013
comment
Спасибо за этот вклад. Очень полезно. Я посмотрю, что я могу сделать с ядром, когда у меня будет время. - person Fnord; 18.12.2013
comment
Не стесняйтесь спрашивать на [email protected] или на github, мы будем рады предоставить вам дополнительные ресурсы. - person Matt; 19.12.2013

Один из способов — использовать модуль cmd и реализовать все разрешенные команды.

Очень простой пример:

import cmd
import string, sys

class CLI(cmd.Cmd):

    def __init__(self):
        cmd.Cmd.__init__(self)
        self.prompt = '> '

    def do_hello(self, arg):
        print "hello again", arg, "!"

    def help_hello(self):
        print "syntax: hello [message]",
        print "-- prints a hello message"

    def do_quit(self, arg):
        sys.exit(1)

    def help_quit(self):
        print "syntax: quit",
        print "-- terminates the application"

    # shortcuts
    do_q = do_quit

cli = CLI()
cli.cmdloop()

Выход:

$ Python cmd-example-1.py

помощь

Documented commands (type help <topic>):
========================================
hello           quit

Undocumented commands:
======================
help            q

> hello world
hello again world !
> q
person Fredrik Pihl    schedule 17.12.2013
comment
ты не отвечаешь на мой вопрос. Я знаю, как использовать cmd.py, как указано во втором предложении абзаца, озаглавленного In Depth. Но это ограничивает и требует от меня написания оболочек для работы с конвейерами и всеми функциями командного терминала... например: dir *.txt › textfile.txt. Я прошу о способах, если таковые имеются, сделать iPython похожим на среду, подобную dos cmd.exe. - person Fnord; 18.12.2013