[英]sys.path() and PYTHONPATH issues
我一直在學習 Python,我在 2.7.3 中工作,我正在嘗試理解import
語句。
該文檔說,當您嘗試導入模塊時,解釋器將首先搜索其中一個內置模塊。
內置模塊是什么意思?
然后,文檔說解釋器在 sys.path 列出的目錄中搜索,並且 sys.path 從這些來源初始化:
PYTHONPATH
(目錄名稱列表,語法與 shell 變量PATH
)。這是我的計算機在命令行模式下使用 python 的 sys.path 命令的示例輸出:(我刪除了一些以便它不會很大)
['', '/usr/lib/python2.7', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntuone-couch', '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol']
現在,我假設 '' 路徑指的是包含“腳本”的目錄,所以我認為其余的將來自我的PYTHONPATH
環境變量。 但是,當我轉到終端並輸入env
, PYTHONPATH
不作為環境變量存在。 我也試過import os
然后os.environ
,但我得到了相同的輸出。
我真的沒有 PYTHONPATH 環境變量嗎? 我不相信我曾經專門定義過 PYTHONPATH 環境變量,但我認為當我安裝新軟件包時,它們會自動更改該環境變量。 如果我沒有 PYTHONPATH,我的 sys.path 是如何填充的? 如果我下載新包,如果我沒有這個 PYTHONPATH 變量,Python 怎么知道去哪里尋找它們?
環境變量如何工作? 據我了解,環境變量特定於為其設置的進程,但是,如果我打開多個終端窗口並運行env
,它們都會顯示許多相同的變量,例如PATH
。 我知道持久環境變量的文件位置,例如/etc/environment
,其中包含我的PATH
變量。 是否可以知道持久性環境變量的存儲位置? 存儲新的持久環境變量的推薦位置是什么? 環境變量實際上如何與 Python 解釋器一起使用? Python 解釋器尋找PYTHONPATH
,但它是如何在細節層面上工作的?
一口氣問這么多! :)
好吧,我試着只回答其中的幾個。
1) 內置模塊是任何帶有 python 版本的模塊。 例如 sys 和 os 模塊是內置模塊。 真的是這樣。
2) 默認情況下,系統上不存在 PYTHONPATH 變量。 當您啟動 python 解釋器時,它會按照您描述的方式填充它搜索模塊的路徑數組。 這是 sys.path 的結果。 但是 sys.path 不是環境變量 PYTHONPATH。 如果您在系統中設置了 PYTHONPATH,那么其中包含的所有路徑都將包含在 Python 解釋器用於搜索模塊的數組中。
我會將環境變量的答案留給其他人,因為我覺得我不是回答這樣一個問題的合適人選。 我的感覺是,它可能會因系統而異。 反正...
希望能幫助到你。
內置模塊是在sys.builtin_module_names
出的模塊。 這些模塊與解釋器一起編譯,因此始終可用。 請注意,它們是標准庫的一部分,但標准庫包含更多模塊。 為了清楚區別,如果您嘗試在 python3.3 中運行此代碼:
>>> import sys >>> sys.path = [] >>> import os # works >>> import traceback # ImportError, traceback is in the stdlib!
在 python2 上都成功,因為import
特殊情況標准庫路徑。 (見本的詳細信息,使更改import
在python3.3)。
如果未找到PYTHONPATH
則它不包含任何額外的目錄。 但是,您鏈接的文檔還指出 python 使用“依賴於安裝的默認值”。 您在sys.path
中看到的目錄是在此“依賴於安裝的默認值”中定義的。 如果您定義了PYTHONPATH
您可以在默認目錄之前將其他目錄添加到sys.path
,但不定義它也不會造成任何傷害。
環境變量是按進程定義的,但是 shell 可以為它們啟動的子進程提供自己的變量“范圍”。 例如,您可以在 shell 文件中設置環境變量,如~/.bashrc
或~/.profile
。
如果您在 Ubuntu 上,定義系統范圍和持久環境變量的pam_enviroment
是使用pam_enviroment
。 您可以在 Ask Ubuntu 上看到這個問題,它展示了如何設置系統范圍的環境變量。
AFAIK 沒有為每個(例如)linux 發行版設置它們的標准方法,顯然,每個操作系統都有自己定義它們的方法。
如果您想了解有關環境變量處理的更詳細說明,您應該詢問Super User 。
您的系統上未定義PYTHONPATH
。 這意味着您在sys.path
看到的除了''
是“依賴於安裝的默認值”。
環境變量表征環境,而不是過程。 但是,您可以在啟動進程時使用 Linux env
命令來調整它們。 這基本上意味着該過程將在不同的環境中運行。 問題的“如果如何工作”部分可以有平台相關的答案。 但是,如果您的意思是文件,我認為您無法“判斷持久性環境變量的存儲位置”。 環境變量可以在任何在某個時間點(通常在啟動時)或僅在命令行中執行的文件中設置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.