2016-01-30 91 views
11

對於那些不熟悉~/.bashrc的人來說,它是一個可定製的腳本,它存在於Unix shell Bash中。當新的終端會話開始時,運行此用戶特定的文件。用戶可以在這個文件中編寫公共變量,函數和環境設置的腳本,從而使它們在打開終端窗口時自動加載。相當於Python的〜/ .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

;每:

命名空間是一個喇叭好主意 - 讓我們做更多的這些!

這就是說,__init__.py可以用來確保某些代碼,如果一個包或它的孩子都是進口的運行,並定製交互式解釋,設置PYTHONSTARTUP環境變量指向一個文件,Python命令運行在交給交互式口譯員之前,例如export PYTHONSTARTUP=$HOME/.pythonrc

只要確保PYTHONSTARTUP文件包含Py2和Py3的合法語法,因爲沒有PYTHON3STARTUP,它將針對兩個版本的Python運行。

5

這是一個壞主意 - 不要這樣做。真。 (命名空間污染是一個嚴重的問題,通過編寫只能在自己的機器上和其他地方無法使用的代碼,您沒有任何優勢;相反,如果您將代碼打包到模塊中,則可以正確發佈和分發代碼)。

但是,如果你堅持,看到the site module,並且特別是它的用戶定製行爲:

在此之後,試圖導入一個名爲usercustomize模塊,它可以執行任意用戶特定的自定義,如果ENABLE_USER_SITE爲真。該文件旨在創建在用戶site-packages目錄中(見下文),該目錄是sys.path的一部分,除非被-s禁用。 ImportError將被默默忽略。

因此,您可以創建一個模塊,用於打開心臟的內容。


這樣熱修補的一個例子:運行爲每個Python腳本不是一個好主意,因爲它打破了命名空間

def myfunc(): 
    print 'hello' 

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

恩!如果像一些批處理命令那樣有一些短系統特定的功能,那麼又會如何呢? – Ja8zyjits

+0

簡短形式:是的,不好。 「顯式比隱式更好」是Python方法的一部分 - 如果您使用的是本地方法,則應明確表示您不是隱式地存在於每個名稱空間中。 –

+1

...如果你想要的東西只是本地shell的擴展,可能使用IPython及其擴展機制?這樣你至少不會干涉腳本的行爲。見http://ipython.readthedocs.org/en/stable/config/extensions/index.html –

4

基本上我想在一個腳本中定義的全球Python函數一把確保每當我我 機器上運行一個python腳本,或者每當我開始一個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 = []