簡體   English   中英

sys.path() 和 PYTHONPATH 問題

[英]sys.path() and PYTHONPATH issues

我一直在學習 Python,我在 2.7.3 中工作,我正在嘗試理解import語句。

  1. 文檔說,當您嘗試導入模塊時,解釋器將首先搜索其中一個內置模塊。

    內置模塊是什么意思?

  2. 然后,文檔說解釋器在 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環境變量。 但是,當我轉到終端並輸入envPYTHONPATH不作為環境變量存在。 我也試過import os然后os.environ ,但我得到了相同的輸出。

    我真的沒有 PYTHONPATH 環境變量嗎? 我不相信我曾經專門定義過 PYTHONPATH 環境變量,但我認為當我安裝新軟件包時,它們會自動更改該環境變量。 如果我沒有 PYTHONPATH,我的 sys.path 是如何填充的? 如果我下載新包,如果我沒有這個 PYTHONPATH 變量,Python 怎么知道去哪里尋找它們?

  3. 環境變量如何工作? 據我了解,環境變量特定於為其設置的進程,但是,如果我打開多個終端窗口並運行env ,它們都會顯示許多相同的變量,例如PATH 我知道持久環境變量的文件位置,例如/etc/environment ,其中包含我的PATH變量。 是否可以知道持久性環境變量的存儲位置? 存儲新的持久環境變量的推薦位置是什么? 環境變量實際上如何與 Python 解釋器一起使用? Python 解釋器尋找PYTHONPATH ,但它是如何在細節層面上工作的?

一口氣問這么多! :)

好吧,我試着只回答其中的幾個。

1) 內置模塊是任何帶有 python 版本的模塊。 例如 sys 和 os 模塊是內置模塊。 真的是這樣。

2) 默認情況下,系統上不存在 PYTHONPATH 變量。 當您啟動 python 解釋器時,它會按照您描述的方式填充它搜索模塊的路徑數組。 這是 sys.path 的結果。 但是 sys.path 不是環境變量 PYTHONPATH。 如果您在系統中設置了 PYTHONPATH,那么其中包含的所有路徑都將包含在 Python 解釋器用於搜索模塊的數組中。

我會將環境變量的答案留給其他人,因為我覺得我不是回答這樣一個問題的合適人選。 我的感覺是,它可能會因系統而異。 反正...

希望能幫助到你。

  1. 內置模塊是在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)。

  2. 如果未找到PYTHONPATH則它不包含任何額外的目錄。 但是,您鏈接的文檔還指出 python 使用“依賴於安裝的默認值”。 您在sys.path中看到的目錄是在此“依賴於安裝的默認值”中定義的。 如果您定義了PYTHONPATH您可以在默認目錄之前將其他目錄添加到sys.path ,但不定義它也不會造成任何傷害。

  3. 環境變量是按進程定義的,但是 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM