Как я могу постоянно хранить команды в приглашении Python REPL /? - PullRequest
6 голосов
/ 21 августа 2011

Есть ли способ хранить команды в Python?

Например, для сохранения команды bash я могу поставить:

# in .bash_profile
alias myproject="cd /path/to/my/project"

$ project

Есть ли способ сохранить команду, например что-то вроде этого:

'store' profile="from userprofile.models import Profile"

>>> profile

который будет работать в командной строке Python, где бы он ни находился? Спасибо.

Ответы [ 4 ]

5 голосов
/ 21 августа 2011

В Bash я предполагаю, что вы определяете этот псевдоним в .profile, .bash_rc или аналогичном файле. В этом файле добавьте строку

export PYTHONSTARTUP=~/.python_rc.py

Это позволит вам создать файл .python_rc.py, который включается при каждом запуске сеанса в приглашении Python / REPL. (Он не будет включен при запуске скриптов Python, потому что это может быть разрушительным для этого.)

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

def profile():
    global Profile
    import sys
    if "path/to/your/project" not in sys.path:
        sys.path.append("path/to/your/project")
    from userprofile.models import Profile

После этого вы сможете вызвать profile() для импорта Profile в приглашении Python.

4 голосов
/ 21 августа 2011

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

In [1]: from userprofile.models import Profile

In [2]: macro profile 1 # profile being the name of the macro, 1 being the line to use
Macro `profile` created. To execute, type its name (without quotes).
=== Macro contents: ===
from userprofile.models import Profile

In [3]: profile # you can now use your macro

Макросы также могут занимать несколько строк, macro some_macro 11 13 будет допустимым многострочным макросом.Команда Django manage.py shell автоматически использует IPython, если он доступен.

1 голос
/ 21 августа 2011

Не используйте exec, это плохо и неправильно

Тем не менее, я думаю, что вам нужно делать то, что вы хотите.

  1. Создать скрипт Python. Добавьте строки к этому как

    # pythonprofile.py
    profile = "from userprofile.models import Profile"
    
  2. Создайте переменную окружения PYTHONSTARTUP, указывающую на скрипт. Это приведет к выполнению кода в интерпретаторе при запуске.

  3. Затем, чтобы фактически использовать команду, выполните

    exec(profile) # Don't ever do this with code you don't trust. 
    

Выполняет код, содержащийся в строке profile в текущей области. exec опасно, поэтому будьте осторожны.

Редактировать: @ Решение Джереми хорошо, но требует, чтобы вы написали больше кода на псевдоним, чем этот метод; либо один работает.

1 голос
/ 21 августа 2011

Любопытное.

Напишите свой «профиль» в виде скрипта и сохраните его где-нибудь.

Создайте сценарий оболочки, который выполняет интерпретатор Python следующим образом:

python -i myprofile.py

Когда вы выполняете скрипт оболочки, он запускает файл myprofile.py и впоследствии запускает интерпретатор.

Так что, если у вас есть файл myprofile.py:

def do_stuff(x):
    print(x)

И запустил ваш скрипт оболочки «ярлык», вы можете сделать:

>>> do_stuff(1)
1
...