2016-01-30 12 views
11

Dla osób niezaznajomionych z ~/.bashrc, jest to konfigurowalny skrypt, który istnieje dla powłoki Uniksa Bash. Po rozpoczęciu nowej sesji terminalowej uruchamiany jest ten plik specyficzny dla użytkownika. Użytkownicy mogą zapisywać w tym pliku wspólne zmienne, funkcje i ustawienia środowiska, co powoduje automatyczne ich ładowanie po otwarciu okna terminala.Pythonowy odpowiednik ~/.bashrc

Czy istnieje coś podobnego do Pythona? Zasadniczo chciałbym zdefiniować garść globalnych funkcji Pythona w skrypcie i upewnić się, że są one ładowane za każdym razem, gdy uruchamiam skrypt Python na moim komputerze lub za każdym razem, gdy uruchamiam terminal Python. Zastanawiam się, czy to zachowanie już istnieje, czy też istnieje prosty sposób na jego wdrożenie.

+0

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

+3

Uruchamianie dla każdego skryptu w języku Python nie jest obsługiwanym zachowaniem ('__init __. Py' może być użyte w celu zapewnienia uruchomienia określonego kodu, jeśli pakiet jest importowany lub jego elementy potomne), ale w celu dostosowania interpretera interaktywnego należy ustawić opcję' PYTHONSTARTUP' Zmienna środowiskowa wskazująca plik z poleceniami Pythona do uruchomienia przed przekazaniem do interaktywnego interpretera, np 'export PYTHONSTARTUP = $ HOME/.pythonrc'. – ShadowRanger

+1

Zobacz https://docs.python.org/2/library/site.html –

Odpowiedz

5

wydajność dla każdego skryptu Python nie jest dobrym pomysłem, ponieważ łamie przestrzeni nazw; na Zen of Python:

Przestrzenie nazw są świetnym pomysłem - zróbmy więcej!

Powiedział, __init__.py mogą być wykorzystywane w celu zapewnienia pewnej kod jest uruchamiany, jeśli opakowanie lub jego dzieci są importowane, a do dostosowywania interaktywny interpreter, ustawić zmienną PYTHONSTARTUP środowiskową aby wskazać plik z poleceń Pythona do uruchomienia przed przekazaniem do interaktywnego tłumacza, np export PYTHONSTARTUP=$HOME/.pythonrc.

Tylko upewnij się, że plik PYTHONSTARTUP zawiera prawną składnię dla Py2 i Py3, ponieważ nie ma PYTHON3STARTUP, zostanie uruchomiony dla obu wersji Pythona.

5

To jest zły pomysł - nie rób tego. Naprawdę. (Zanieczyszczenie przestrzeni nazw jest poważnym problemem i nie robisz nikomu żadnych korzyści, pisząc kod, który działa tylko na twoich własnych maszynach i nigdzie indziej, a jeśli spakujesz kod w module, możesz go opublikować i rozpowszechniać właściwie).

Jednakże, jeśli nalegać, zobacz the site module, a zwłaszcza jego zachowanie użytkownika personalizacja:

Następnie podejmowana jest próba zaimportować moduł o nazwie usercustomize, które mogą wykonywać dowolne dostosowania specyficzne dla użytkownika, jeśli ENABLE_USER_SITE jest prawdziwe. Plik ten ma być utworzony w katalogu plików użytkownika-witryny (patrz poniżej), który jest częścią sys.path, chyba że jest wyłączony przez -s. An ImportError zostanie cicho zignorowany.

W ten sposób można utworzyć moduł usercustomize, który jest dopasowany do zawartości twojego serca.


Jako przykład takiej funkcji HotPatching:

def myfunc(): 
    print 'hello' 

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

um! co, jeśli istnieją pewne krótkie funkcje specyficzne dla systemu, takie jak niektóre polecenia wsadowe, wciąż są złe? – Ja8zyjits

+0

Skrócona forma: Tak, źle. "Jawny jest lepszy niż niejawny" jest częścią Python Way - jeśli używasz czegoś lokalnego, powinno to być jasne, że jesteś raczej niż niejawnie obecny w każdym obszarze nazw. –

+1

... jeśli chcesz czegoś, co jest tylko rozszerzeniem lokalnej powłoki, może użyjesz IPython i jego mechanizmu rozszerzenia? W ten sposób przynajmniej nie mieszasz się z zachowaniem skryptów. Zobacz http://ipython.readthedocs.org/en/stable/config/extensions/index.html –

4

Zasadniczo chciałbym zdefiniować kilka globalnych funkcji Pythona w skrypcie i upewnić się, że są one ładowane ilekroć uruchomić skrypt Pythona na moim maszynie lub gdy zacznę terminalu Python

Porozmawiajmy o Twojej drugiej opcji. Istnieją sposoby na załadowanie funkcji i zmiennych podczas uruchamiania terminala. Zalecam używanie IPython zamiast domyślnego terminala Python.Jednak aby to zrobić bez instalowania programu IPython, zmodyfikuj zmienną środowiskową PYTHONSTARTUP. Utracisz możliwość podziału plików konfiguracyjnych.

Po zainstalowaniu IPythona należy zainicjować jego pliki konfiguracyjne. Aby utworzyć profil domyślny:

ipython profile create 

Aby rozwiązać wspólny wątek w innych odpowiedzi, zmienne i funkcje globalne są szczególnie jeśli są one domyślnie zdefiniowane zły pomysł. Można jednak zdefiniować i załadować osobne pliki konfiguracyjne podczas uruchamiania ipython. Aby stworzyć taki profil:

ipython profile create <name> 

Aby załadować profil <name>:

ipython --profile=<name> 

teraz zmodyfikować pliki konfiguracyjne. Uruchomić to polecenie, aby sprawdzić, gdzie są one:

ipython locate profile 

Należy znaleźć ipython_config.py. Sugerowałbym przeczytanie tego, ma bardzo pomocne komentarze.

Ale aby dostać się do punktu, można załadować dowolne funkcje i zmienne podczas uruchamiania ipython dodając te linijki do pliku konfiguracyjnego:

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

jestem odwołującego the IPython docs i komentarze w 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 = []