PATH,PYTHONPATH,sys.path的區別,作用,設置


PATH

在PATH中的 python module 不能被 import,在 PATH 中的一些命令,例如 *.exe,可以直接在cmd中運行,而不用明確的路徑,我們在給 python 安裝一些 packages 的時候,有一些 Scripts 被安裝到 /Scripts 文件夾中,如果 /Scripts 文件夾路徑不在 PATH 中,會有提示

PATH是系統環境變量,PATH作用是用戶在命令行窗口執行一個命令,則在PATH變量設置的目錄下依次尋找該命令或對應的執行文件,若找到,則執行,若沒有找到,則命令行窗口返回無效命令

path是告訴系統,當要求系統運行一個程序而沒有告訴它程序所在的完整路徑時,系統除了在當前目錄下面尋找此程序外,還應到那些目錄下去找。

關於PATH的作用:
PATH說簡單點就是一個字符串變量,當輸入命令的時候LINUX會去查找PATH里面記錄的路徑。比如在根目錄/下可以輸入命令ls,在/usr目錄下也可以輸入ls,但其實ls這個命令根本不在這個兩個目錄下,事實上當你輸入命令的時候LINUX會去/bin,/usr/bin,/sbin等目錄下面去找你此時輸入的命令,而PATH的值恰恰就是/bin:/sbin:/usr/bin:……。其中的冒號使目錄與目錄之間隔開。


關於新增自定義路徑:
現在假設你新安裝了一個命令在/usr/locar/new/bin下面,而你又想像ls一樣在任何地方都使用這個命令,你就需要修改環境變量PATH了,准確的說就是給PATH增加一個值/usr/locar/new/bin。你只需要一行bash命令export PATH=$PATH:/usr/locar/new/bin。這條命令的意思太清楚不過了,使PATH自增:/usr/locar/new/bin,既PATH=PATH+":/usr/locar/new/bin";通常的做法是把這行bash命令寫到/root/.bashrc的末尾,然后當你重新登陸LINUX的時候(應該是linux啟動時就會執行這個文件),新的默認路徑就添加進去了。當然這里你直接用source /root/.bashrc執行這個文件重新登陸了。你可以用echo $PATH命令查看PATH的值。


關於刪除自定義路徑:
當某天你發現你新增的路徑/usr/locar/new/bin已經沒用了的話,你可以修改/root/.bashrc文件里面你新增的路徑。或者你可以修改/etc/profile文件刪除你不需要的路徑.

一般來說,配置交叉編譯工具鏈的時候需要指定編譯工具的路徑,此時就需要設置環境變量。例如我的mips-linux-gcc編譯器在“/opt/au1200_rm/build_tools/bin”目錄下,build_tools就是我的編譯工具,則有如下三種方法來設置環境變量:
--------------------------------------------
臨時環境變量(重啟后消失)
-----------------------------------------------------
1、直接用export命令:
#export PATH=$PATH:/opt/au1200_rm/build_tools/bin
查看是否已經設好,可用命令export查看:
[root@localhost bin]# export
declare -x BASH_ENV="/root/.bashrc"
declare -x G_BROKEN_FILENAMES="1"
declare -x HISTSIZE="1000"
declare -x HOME="/root"
declare -x HOSTNAME="localhost.localdomain"
declare -x INPUTRC="/etc/inputrc"
declare -x LANG="zh_CN.GB18030"
declare -x LANGUAGE="zh_CN.GB18030:zh_CN.GB2312:zh_CN"
declare -x LESSOPEN="|/usr/bin/lesspipe.sh %s"
declare -x LOGNAME="root"
declare -x LS_COLORS="no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:"
declare -x MAIL="/var/spool/mail/root"
declare -x OLDPWD="/opt/au1200_rm/build_tools"
declare -x PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin:/opt/au1200_rm/build_tools/bin"
declare -x PWD="/opt/au1200_rm/build_tools/bin"
declare -x SHELL="/bin/bash"
declare -x SHLVL="1"
declare -x SSH_ASKPASS="/usr/libexec/openssh/gnome-ssh-askpass"
declare -x SSH_AUTH_SOCK="/tmp/ssh-XX3LKWhz/agent.4242"
declare -x SSH_CLIENT="10.3.37.152 2236 22"
declare -x SSH_CONNECTION="10.3.37.152 2236 10.3.37.186 22"
declare -x SSH_TTY="/dev/pts/2"
declare -x TERM="linux"
declare -x USER="root"
declare -x USERNAME="root"
可以看到,環境變量已經設好,PATH里面已經有了我要加的編譯器的路徑。
里去操作了。

永久環境變量
--------------------------------------------------------
2、修改profile文件:
 所有用戶(不安全)
 修 改/etc/profile(對所有用戶都是有效的)
#vi /etc/profile
在里面加入:
export PATH="$PATH:/opt/au1200_rm/build_tools/bin"

3. 修改.bashrc文件:
# vi /~/.bashrc
 (單獨用戶)
 修改~/.bashrc文件。 htt(74)p://www.icwin.net/bbs http://www.wantso.com (每個用戶目錄下都有,ls -all)
 cd ~
 vi .bashrc
在里面加入:
export PATH="$PATH:/opt/au1200_rm/build_tools/bin"

后兩種方法一般需要重新注銷系統才能生效,最后可以通過echo命令測試一下:
# echo $PATH
看看輸出里面是不是已經有了/my_new_path這個路徑了。

-----------------------------------------------------------------------------------------------------------------------

 “/bin”、“/sbin”、“/usr/bin”、“/usr/sbin”、“/usr/local/bin”等路徑已經在系統環境變量中了,如果可執行文件在這幾個標准位置,在終端命令行輸入該軟件可執行文件的文件名和參數(如果需要參數),回車即可。

  如果不在標准位置,文件名前面需要加上完整的路徑。不過每次都這樣跑就太麻煩了,一個“一勞永逸”的辦法是把這個路徑加入環境變量。命令 “PATH=$PATH:路徑”可以把這個路徑加入環境變量,但是退出這個命令行就失效了。要想永久生效,需要把這行添加到環境變量文件里。有兩個文件可選:“/etc/profile”和用戶主目錄下的“.bash_profile”,“/etc/profile”對系統里所有用戶都有效,用戶主目錄下的“.bash_profile”只對這個用戶有效。

  “PATH=$PATH:路徑1:路徑2:...:路徑n”,意思是可執行文件的路徑包括原先設定的路徑,也包括從“路徑1”到“路徑n”的所有路徑。當用戶輸入一個一串字符並按回車后,shell會依次在這些路徑里找對應的可執行文件並交給系統核心執行。那個“$PATH”表示原先設定的路徑仍然有效,注意不要漏掉。某些軟件可能還有“PATH”以外類型的環境變量需要添加,但方法與此相同,並且也需要注意“$”。

  注意,與DOS/Window不同,UNIX類系統環境變量中路徑名用冒號分隔,不是分號。另外,軟件越裝越多,環境變量越添越多,為了避免造成混亂,建議所有語句都添加在文件結尾,按軟件的安裝順序添加。

  格式如下():

  # 軟件名-版本號

  PATH=$PATH:路徑1:路徑2:...:路徑n

  其他環境變量=$其他環境變量:...

  在“profile”和“.bash_profile”中,“#”是注釋符號,寫在這里除了視覺分隔外沒有任何效果。

  設置完畢,注銷並重新登錄,設置就生效了。如果不注銷,直接在shell里執行這些語句,也能生效,但是作用范圍只限於執行了這些語句的shell。

  相關的環境變量生效后,就不必老跑到軟件的可執行文件目錄

原文鏈接:http://blog.sina.com.cn/s/blog_a3fb4c660102vbmv.html

PYTHONPATH

如果我們使用 PYTHONPATH 中的 modules,那么在運行 python 前,就要把 path 加到 os.environ['PYTHONPATH'],在運行 python 后再加,那些模塊不能直接被導入

不太好的解決辦法

1
2
3
import sys
import os
sys.path.append( os.path.join( os.path.dirname(__file__), os.path.pardir ) )

在 google 模塊導入問題的時候,大部分博客給出了這樣的解決方案,在每個文件配置
這樣的代碼,他做到了將當前文件的路徑加入到 Python 模塊搜索路徑 sys.path 中,
確實可以起到解決 bug 的作用,但是每個文件都寫上這樣一段代碼,實在讓人不舒服,
下面我們還是來學習下 Python 模塊搜索路徑是如何運作的

Python 從哪些路徑導入模塊

1
2
3
4
1、程序的主目錄
2、PYTHONPATH 目錄(如果已經進行了設置)
3、標准鏈接庫目錄
4、任何 .pth 文件的內容(如果存在的話)

主目錄

Python 首先會在主目錄內搜索導入的文件。如果程序完全位於單一目錄,所有導入的會
自動工作,而並不需要配置路徑。由於這個目錄總是先搜索,其文件也將覆蓋路徑上的
其他目錄中具有同樣名稱的模塊。如果你需要在自己程序中使用庫模塊的話,小心不要
以這種方式以外地隱藏庫模塊。

PYTHONPATH 目錄

之后,Python 會從左到右搜索 PYTHONPATH 環境變量設置中羅列出的所有目錄,可以是
用戶定義或平台特定的目錄名。因為 Python 優先搜索主目錄,當導入的文件跨目錄時,
這個設置才顯得格外重要。

標准庫目錄

接着,Python 會自動搜索標准庫模塊安裝在機器上的那些目錄,這塊通常不需要在單獨
配置

.pth 文件目錄

最后,Python 有個相當新的功能,允許用戶把有效的目錄添加到模塊搜索路徑中去,
也就是在后綴名為 .pth (路徑的意思)的文本文件中一行一行的列出目錄。他是
PYTHONPATH 的一種替代方案,我們也可以把它放在標注庫所在位置的 sitepackages 的
子目錄中擴展模塊搜索路徑

應用到當前項目

在開發大型項目之前,我們可以將項目根目錄作為 PYTHONPATH 存到環境變量中,也可以
每次運行前之前該命令

1

2

3

4

$ touch env.sh
$ vim env.sh

export PYTHONPATH=./ # 將項目根目錄作為PYTHONPATH

$ source env.sh # 在項目運行之前執行該命令

 

最后我們可以通過下面兩行代碼來查看當前項目python模塊搜索路徑和導入的模塊

1
2
3
4
5
6

import sys

print(sys.path) # 輸出python模塊搜索目錄

print(list(sys.modules.keys())) # 輸出python已經導入的模塊列表

轉載於:https://wxnacy.com/2017/08/15/python-2017-08-15-config-pythonpath/

sys.path

官方文檔說明:A list of strings that specifies the search path for modules. Initialized from the environment variable PYTHONPATH, plus an installation-dependent default.

sys.path 初始化的時候有兩部分:os.environ['PYTHONPATH'] 和 默認的安裝依賴的一些路徑(例如 python 安裝的根目錄 和 pythonxx.zip)

sys.path 的作用:

  1. 與 PYTHONPATH 不同,sys.path 可以在 python 運行后添加我們的 module path,然后直接 import,應該說python只搜索 sys.path 中的 modules,不搜索 
  2. 我們可以通過 os.environ['PYTHONPATH'] 來傳遞我們的 module path
  3. 我們可以給 python 添加自定義的 module path,讓 python 在運行的時候自動加到 sys.path 中,方法是 在 /Lib/site-packages/ 中添加 *.pth 文件,在文件里面加上 module path,參考鏈接:https://medium.com/@arnaud.bertrand/modifying-python-s-search-path-with-pth-files-2a41a4143574

轉載於:https://blog.csdn.net/weixin_30402343/article/details/96321133


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM