Как добавить команду в интерактивную оболочку Python? - PullRequest
2 голосов
/ 25 октября 2010

Я пытаюсь сэкономить всего несколько нажатий клавиш для команды, которую я довольно часто набираю в Python.

В моем скрипте запуска Python я определяю функцию load, которая похожа на импорт, но добавляет некоторые функции. Требуется одна строка:

def load(s):
  # Do some stuff
  return something

Чтобы вызвать эту функцию, я должен набрать

>>> load('something')

Я бы предпочел просто набрать:

>>> load something

Я использую Python с поддержкой readline , поэтому я знаю, что там есть некоторая программируемость, но я не знаю, возможно ли подобное с его помощью.

Я попытался обойти это, используя InteractivConsole и создав его экземпляр в моем файле запуска, например:

import code, re, traceback

class LoadingInteractiveConsole(code.InteractiveConsole):
  def raw_input(self, prompt = ""):
    s = raw_input(prompt)
    match = re.match('^load\s+(.+)', s)
    if match:
      module = match.group(1)
      try:
        load(module)
        print "Loaded " + module
      except ImportError:
        traceback.print_exc()
      return ''
    else:
      return s

console = LoadingInteractiveConsole()
console.interact("")

Это работает с предупреждением, что мне нужно дважды нажать Ctrl-D, чтобы выйти из интерпретатора python: один раз, чтобы выйти из моей пользовательской консоли, один раз, чтобы выйти из реальной.

Есть ли способ сделать это без написания специальной программы на C и встраивания в нее интерпретатора?

Редактировать

Вне канала у меня было предложение добавить это в конец моего файла запуска:

import sys
sys.exit()

Это работает достаточно хорошо, но я все еще заинтересован в альтернативных решениях.

Ответы [ 3 ]

7 голосов
/ 25 октября 2010

Вы можете попробовать ipython - который дает оболочку python, которая допускает многие вещи, включая автоматические скобки , которая дает вам вызов функции по вашему запросу.

0 голосов
/ 02 ноября 2010

Не хочу отвечать на мой собственный вопрос, но не было ответа, который работал бы для всех версий Python, которые я использую.Помимо решения, которое я разместил в своем редакторе вопросов (именно этим я сейчас и пользуюсь), есть еще одно:

Редактировать .bashrc, содержащее следующие строки:

alias python3='python3 ~/py/shellreplace.py'
alias python='python ~/py/shellreplace.py'
alias python27='python27 ~/py/shellreplace.py'

Тогдапросто переместите весь код LoadingInteractiveConsole в файл ~/py/shellreplace.py Как только скрипт завершит выполнение, python прекратит выполнение, и улучшенный интерактивный сеанс будет без шва.

0 голосов
/ 25 октября 2010

Я думаю, вам нужен модуль cmd.

См. Учебное пособие здесь: http://wiki.python.org/moin/CmdModule

...