Есть ли эквивалент ~/.bashrc в Python?

Задумывались ли вы когда-нибудь, есть ли в Python что-то похожее на файл ~/.bashrc, который использует Bash? Ну, не удивляйтесь больше! В этом подробном руководстве мы рассмотрим различные возможности Python, позволяющие воспроизвести функциональность ~/.bashrc и настроить среду Python по своему вкусу.

Если вы хотите установить общие переменные среды, определить повторно используемые функции или обеспечить запуск некоторого кода при каждом запуске Python, это руководство поможет вам. Итак, давайте начнем!

Python предлагает возможность настройки поведения при запуске, аналогичного ~/.bashrc, с использованием переменной среды PYTHONSTARTUP. Указав это на скрипт Python, содержащий произвольный код, вы можете установить общие переменные среды, определить повторно используемые функции и псевдонимы, настроить предпочтения REPL, автоматически загружать библиотеки и т. д. Очень похоже на ~/.bashrc для оболочек Bash!

Что делает ~/.bashrc?

Для тех, кто не знаком, ~/.bashrc — это сценарий оболочки Bash, который запускается всякий раз, когда запускается новый сеанс терминала в Linux и других системах на базе Unix.

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

Этот пользовательский сценарий запускается автоматически, без необходимости каждый раз создавать его вручную. Довольно изящно!

Некоторые распространенные варианты использования ~/.bashrc включают:

  • Установка переменной PATH для добавления пользовательских каталогов контейнеров
  • Определение сокращенных функций оболочки для часто используемых команд
  • Установка настроек терминала, таких как цвета, формат приглашений и т. д.
  • Совмещение длинных команд с короткими никнеймами
  • Загрузка библиотек, предоставляющих полезные функции оболочки.

И многое другое! Неудивительно, что он так популярен среди опытных пользователей Linux и системных администраторов.

Но что, если вам нужна функциональность, аналогичная Python? Читай дальше что бы узнать!

Файл PYTHONSTARTUP — эквивалент ~/.bashrc для Python.

Самое близкое, что Python может предложить по сравнению с ~/.bashrc, — это переменная среды PYTHONSTARTUP.

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

Вот пример, демонстрирующий его использование:

# Содержимое файла ~/.pythonstartup
import sys

print('Python %s on %s' % (sys.version, sys.platform))

def hello():
    print("Hello World!")

Установите переменную ENV, чтобы этот скрипт выполнялся при запуске интерпретатора Python

$ export PYTHONSTARTUP=~/.pythonstartup

Теперь, когда вы запустите Python из терминала, вы увидите:

Python 3.8.2 (default, Apr 27 2020, 15:53:34)[GCC 9.3.0] on linux
>>> hello()
Hello World!

Скрипт .pythonstartup запускается автоматически и определяет для нас функцию многократного использования hello()!

Некоторые ключевые моменты, на которые следует обратить внимание:

  • Файл PYTHONSTARTUP может содержать любой допустимый код Python.
  • Он запускается перед передачей управления интерактивному интерпретатору.
  • Определенные функции и переменные доступны в интерактивном пространстве имен.
  • Он запускается каждый раз, когда вы запускаете Python REPL или выполняете скрипты Python (с оговорками, см. ниже).

Таким образом, этот механизм позволяет вам настроить среду Python по своему вкусу, как ~/.bashrc!

Различия между PYTHONSTARTUP и ~/.bashrc

Однако в реализации Python есть некоторые тонкие различия:

  1. Нет отдельного файла для сценариев Python: сценарий PYTHONSTARTUP запускается безоговорочно при каждом запуске любого процесса Python — как интерактивных оболочек, так и программ Python. Не существует отдельного файла ~/.pythonrc, который бы запускался только для сеансов REPL. Хотя это удобно, это может привести к загрязнению пространства имен ваших сценариев.
  2. Нет автоматического поиска импортированных модулей: импортируемые вами модули не получают автоматически источник PYTHONSTARTUP. Это может привести к путанице, если вы ожидаете, что какой-то код будет выполняться при каждом импорте.
  3. Отсутствие файлов, специфичных для версии Python. В отличие от Bash, для разных версий Python не существует отдельного файла запуска. Один и тот же PYTHONSTARTUP работает для интерпретаторов Python 2.x и Python 3.x. Таким образом, вам придется обрабатывать различия версий в одном и том же сценарии, используя условную логику.
  4. Переопределяет настройку сайта. Любая настройка всего сайта, настроенная с помощью модуля site.USER_SITEили usercustomize, переопределяется PYTHONSTARTUP, если она установлена.

Итак, хотя PYTHONSTARTUP предоставляет те же функции, что и ~/.bashrc, существуют некоторые тонкие поведенческие различия, о которых следует помнить.

Распространенное использование PYTHONSTARTUP

Теперь, когда вы понимаете, как работает PYTHONSTARTUP, каковы наиболее распространенные случаи его использования?

Вот несколько идей по настройке среды Python:

1. Определите удобные функции и псевдонимы

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

# ~/.pythonstartup
import os, sys
 
def ll():
    return os.listdir(os.curdir)
 
alias = lambda x: os.system(x)

Теперь у вас есть возможность перечислить содержимое каталога и легко вызывать команды оболочки прямо из Python!

2. Установите пользовательские переменные среды

Вам нужно передать некоторые значения конфигурации в ваши сценарии? Установите их в PYTHONSTARTUP один раз и забудьте об этом!

import os

os.environ['API_TOKEN'] = 'secret123'
os.environ['DB_NAME'] = 'myappdb'

Это автоматически устанавливает переменные среды, доступные для всего вашего кода Python.

3. Настройте поведение REPL

Настройте Python REPL в соответствии со своими предпочтениями:

import sys
sys.ps1 = "[custom]> "       # Primary prompt
sys.ps2 = "... "             # Continuation prompt

Вы можете настроить формат подсказки, цветовую схему, историю ввода и т. д.

4. Загрузка вспомогательных библиотек и расширений

По умолчанию добавьте в свою среду Python полезный код и инструменты:

import numpy as np         # Import numpy by default
import custom_utils as cu  # Custom modules
 
%load_ext line_profiler    # IPython extensions

Это устраняет повторяющиеся операторы импорта и дает вам доступ к дополнительным функциям при каждом взаимодействии с Python. Как видите, варианты использования безграничны! PYTHONSTARTUP позволяет вам настроить Python в соответствии с вашими уникальными потребностями и предпочтениями.

Альтернативные варианты

Хотя PYTHONSTARTUP — самый простой способ воспроизвести функциональность ~/.bashrc, есть еще несколько вариантов:

1. Модуль пользовательской настройки.

Python автоматически пытается импортировать модуль usercustomize, указанный при запуске, из папки site-packages.

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

# usercustomize.py
 
def setup():
   print("Setting up environment!")
 
setup()

Хотя он запускается раньше, чем PYTHONSTARTUP, вы теряете возможность выборочно включать/отключать его для каждого процесса.

2. Конфигурация IPython

Если вы используете интерактивную оболочку IPython вместо Python REPL по умолчанию, вы можете использовать ее надежную систему конфигурации для настройки аналогично PYTHONSTARTUP.

Просто отредактируйте ipython_config.py в папке профиля IPython.

Таким образом, хотя PYTHONSTARTUP является наиболее простым подходом, у других вариантов также есть свои плюсы и минусы, которые необходимо оценить.

Лучшие практики

Вот несколько советов по эффективному использованию PYTHONSTARTUP:

  • Импортируйте средства защиты для предотвращения ошибок, если код импортируется в другое место:
    if __name__ == "__main__":
        # Startup code
  • Проверка версии перед использованием особенностей Python 3+.
    import sys
    
    if sys.version_info >= (3, 0):
            # Python 3 code
        else:
            # Python 2 code
  • Тестируйте в интерактивном режиме после внесения изменений, чтобы заранее выявить проблемы.
  • Документируйте код, чтобы вы могли понять его в будущем!

Следуя этим рекомендациям, вы сможете избежать распространенных ошибок и создать потрясающую настраиваемую среду с помощью PYTHONSTARTUP!

Часто задаваемые вопросы

Вот несколько распространенных вопросов о настройке запуска Python:

Почему мои функции PYTHONSTARTUP недоступны при импорте модулей?

Как упоминалось ранее, только интерактивный интерпретатор использует PYTHONSTARTUP, но не импортирует модули. Поэтому определите свои утилиты внутри модулей и явно импортируйте их везде, где это необходимо.

Как выполнить другой код запуска для Python 2 и Python 3?

Используйте проверки if/else для основной версии Python для выполнения кода, специфичного для версии, например: выборочно

import sys
    if sys.version_info[0] == 3:
        # Python 3.x code
    else:
        # Python 2.x code

Что делать, если мне нужны файлы запуска для конкретной версии?

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

Я надеюсь, что это руководство дало вам хороший обзор того, как настроить запуск Python с помощью PYTHONSTARTUP и различных альтернатив. Возможности огромны — вперед, раскройте свой творческий потенциал и настройте свою среду Python до совершенства!