2016-01-30 3 views
11

Для тех, кто не знаком с ~/.bashrc, это настраиваемый скрипт, который существует для оболочки Unix Bash. Когда начинается новый сеанс терминала, этот пользовательский файл запускается. Пользователи могут создавать сценарии общих переменных, функций и параметров среды в этом файле и, таким образом, автоматически загружать их, когда они открывают окно терминала.Питон-эквивалент ~/.bashrc

Что-то подобное существует для Python? По сути, я хотел бы определить несколько глобальных функций Python в скрипте и убедиться, что они загружаются всякий раз, когда я запускаю сценарий Python на своей машине или когда я запускаю терминал Python. Мне интересно, существует ли это поведение уже сейчас, или если есть прямой способ его реализации.

+0

См. ['__init __. Py'] (http://stackoverflow.com/questions/448271/what-is-init-py-for). – e0k

+3

Запуск для каждого скрипта Python не поддерживается ('__init __. Py' может использоваться для обеспечения выполнения определенного кода, если импортирован пакет или его дочерние элементы), но для настройки интерактивного интерпретатора задайте' PYTHONSTARTUP' переменную окружения указать на файл с командами Python для запуска до передачи интерактивному интерпретатору, например 'export PYTHONSTARTUP = $ HOME/.pythonrc'. – ShadowRanger

+1

См. Https://docs.python.org/2/library/site.html –

ответ

5

Запуск для каждого сценария Python не является хорошей идеей, поскольку она нарушает разделяет пространства имен; за Zen of Python:

Пространства имен - одна хорошая идея - будем делать больше!

Тем не менее, __init__.py может быть использован для обеспечения определенного кода выполняется, если пакет или его дети будут импортированы, а также для настройки интерактивного интерпретатора, установить переменную PYTHONSTARTUP среды, чтобы указать на файл с Python команды для запуска перед передачей интерактивному интерпретатору, например export PYTHONSTARTUP=$HOME/.pythonrc.

Просто убедитесь, что файл PYTHONSTARTUP содержит легальный синтаксис для Py2 и Py3, потому что нет PYTHON3STARTUP, он будет запущен для обеих версий Python.

5

Это плохая идея - не делайте этого. В самом деле. (Загрязнение пространства имен является серьезной проблемой, и вы никому не помогаете, написав код, который работает только на ваших собственных машинах и нигде больше, наоборот, если вы упаковываете свой код в модуль, вы можете публиковать его и распространять его должным образом).

Однако, если вы настаиваете, см the site module, и особенно ее пользователем настройки поведения:

После этого делается попытка импортировать модуль с именем usercustomize, который может выполнить произвольные пользовательские настройки, если верно ENABLE_USER_SITE. Этот файл предназначен для создания в каталоге пользовательских сайтов-пакетов (см. Ниже), который является частью sys.path, если он не отключен -s. ImportError будет игнорироваться.

Таким образом, вы можете создать модуль usercustomize, который hotpatches подходит для вашего сердца.


В качестве примера такой функции HotPatching:

def myfunc(): 
    print 'hello' 

main_ns = __import__('__main__') 
main_ns.myfunc = myfunc 
+0

um! что, если есть некоторые короткие системные функции, такие как некоторые командные команды, все еще плохие? – Ja8zyjits

+0

Краткая форма: Да, плохо. «Явный лучше, чем неявный» является частью Пути Python - если вы используете что-то локальное, оно должно быть явным, что вы скорее, чем неявно присутствуете в каждом пространстве имен. –

+1

... если вы хотите что-то, что является расширением локальной оболочки, возможно, используйте IPython и его механизм расширения? Таким образом, вы, по крайней мере, не вмешиваетесь в поведение скриптов. См. Http://ipython.readthedocs.org/en/stable/config/extensions/index.html –

4

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

Давайте поговорим о вашем втором варианте. Существуют способы загрузки функций и переменных при запуске терминала. Я бы рекомендовал использовать IPython вместо стандартного терминала Python.Однако для этого без установки IPython измените переменную окружения PYTHONSTARTUP. Вы теряете возможность разделить ваши файлы конфигурации.

После установки IPython вам необходимо инициализировать свои файлы конфигурации. Чтобы создать профиль по умолчанию:

ipython profile create 

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

ipython profile create <name> 

Для загрузки <name> профиля:

ipython --profile=<name> 

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

ipython locate profile 

Вы должны найти ipython_config.py. Я бы предложил его прочитать, у него очень полезные комментарии.

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

c.InteractiveShellApp.exec_lines = [ "def p(s): print s" ] 
c.InteractiveShellApp.exec_files = [ "/path/of/script.py" ] 

Я ссылающегося the IPython docs и комментарии в ipython_config.py:

96 # List of files to run at IPython startup.          
97 # c.TerminalIPythonApp.exec_files = []           
98                     
99 # lines of code to run at IPython startup.          
100 # c.TerminalIPythonApp.exec_lines = []