使用 .bash_profile 設置環境變數:只有最後一次導出才能正常工作
我正在嘗試使用在 Unix 中導出一些環境變數
.bash_profile
它現在是這樣的:
export PATH=${PATH}:/usr/local/cuda-6.0/bin/ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda-6.0/targets/x86_64-linux/lib/
之後,我嘗試執行使用這些變數的 python 腳本
python >>> import theano
我得到這個錯誤:
ERROR (theano.sandbox.cuda): nvcc compiler not found on $PATH. Check your nvcc installation and try again.
然後我退出python,手動重新執行第一行,
.bash_profile
它就可以工作了。如果我像這樣更改導出的順序:
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda-6.0/targets/x86_64-linux/lib/ export PATH=${PATH}:/usr/local/cuda-6.0/bin/
再嘗試一次從 python 導入 theano 我得到這個錯誤:
ERROR (theano.sandbox.cuda): Failed to compile cuda_ndarray.cu: libcublas.so.6.0: cannot open shared object file: No such file or directory WARNING (theano.sandbox.cuda): CUDA is installed, but device gpu is not available (error: cuda unavilable)
這表明導出
LD_LIBRARY_PATH
不起作用。我執行與以前相同的過程,退出 python 重新執行第一行,然後正確導入。將第一個導出添加到 bash 腳本的最後一行(導出兩次)使第一個/第三個導出工作正常,但第二個沒有,也就是說,只有最後一個導出工作正常。
我已經嘗試對變數執行 echo 命令,並且它可以正常列印,就好像它們設置正確一樣,但是我無法將它們與 python 一起使用。此外,當手動重新設置它們時不會雙重導出它們,但重新設置會:
-bash-4.2$ echo $LD_LIBRARY_PATH :/usr/local/cuda-6.0/targets/x86_64-linux/lib/ -bash-4.2$ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda-6.0/targets/x86_64-linux/lib/ -bash-4.2$ echo $LD_LIBRARY_PATH :/usr/local/cuda-6.0/targets/x86_64-linux/lib/ -bash-4.2$ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda-6.0/targets/x86_64-linux/lib/ -bash-4.2$ echo $LD_LIBRARY_PATH :/usr/local/cuda-6.0/targets/x86_64-linux/lib/:/usr/local/cuda-6.0/targets/x86_64-linux/lib/
我實際上已經通過
PATH
在 python 腳本中重新設置變數來解決這個問題,但是讓我感到困擾的是我找不到發生這種情況的原因一些資訊:
-bash-4.2$ bash --version GNU bash, version 4.2.53(1)-release (x86_64-redhat-linux-gnu) -bash-4.2$ cat /etc/*-release Fedora release 19 (Schrödinger’s Cat)
我在我的水晶球中看到您正在 Windows 機器上編輯文件。
Windows 和 Linux 有不同的方式來表示換行符。在 Linux(與任何 unix 系統一樣)上,一行由一系列字元組成,這些字元以換行符 (LF =
\n
= Ctrl+J) 字元結尾。在 Windows 上,行由兩個字元序列分隔:輸入,然後換行 (CRLF =\r\n
= Ctrl+M Ctrl+J)。您的文件包含
export PATH=…
命令,然後是 CR、LF 和最後export LD_LIBRARY_PATH
沒有換行符的命令。對於 Linux 程序,相同的字節序列表示export PATH=…
末尾有一個 CR 字元,然後是換行符,然後是包含export PATH=…
. 您的 shell 忠實地執行了第一個命令,該命令添加了PATH
一個名稱以 CR 字元結尾的目錄。由於沒有該名稱的目錄,因此更改PATH
無效。然後 shell 將部分行視為完整行,這是 set 的預期命令LD_LIBRARY_PATH
。當您第二次附加目錄時,您沒有在命令中鍵入 CR 字元,因此該命令有效。當您顯示輸出時,終端將 CR 字元解釋為“移回行首”。由於您在 CR 字元之前和之後具有完全相同的內容,因此該內容似乎列印了一次 - 實際上它在同一位置列印了兩次。
在 Linux 下編輯你的 Linux 配置文件,或者告訴你的 Windows 編輯器使用 Linux 行結尾(大多數文本編輯器比記事本少腦死)。