.bash_profile
を使用してUnixでいくつかの環境変数をエクスポートしようとしています
これは次のようになります。
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/
そして、もう一度theanoをpythonからインポートしてみてください。このエラーが発生します:
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
が機能しなかったことを示しています。以前と同じ手順を実行し、exit python最初の行を再実行すると、正しくインポートされます。
最初のエクスポートをbashスクリプトの最後の行に追加すると(2回エクスポート)、この最初/ 3番目のエクスポートは正常に機能しますが、2番目は機能しません。つまり、最後のエクスポートのみが正しく機能します。
変数に対してエコーコマンドを実行しようとしましたが、正しく設定されているかのように正常に出力されていましたが、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/
pythonスクリプト内でPATH
変数を再設定することでこの問題を実際に解決しましたが、これが発生している理由が見つからないのが気になります
いくつかの情報:
-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では、行は2文字のシーケンスで区切られます。キャリッジリターン、ラインフィード(CRLF = \r\n
= Ctrl + M Ctrl + J)です。
ファイルには、export PATH=…
コマンド、次にCR、LF、およびexport LD_LIBRARY_PATH
コマンドが含まれており、末尾に改行はありません。 Linuxプログラムの場合、同じバイトシーケンスはexport PATH=…
を表し、末尾にCR文字があり、次に改行、次にexport PATH=…
を含む未完成の行が続きます。シェルは最初のコマンドを忠実に実行します。このコマンドは、名前がCR文字で終わるディレクトリをPATH
に追加します。その名前のディレクトリがないため、PATH
を変更しても効果はありません。次に、シェルは部分的な行を完全な行であるかのように扱います。これは、LD_LIBRARY_PATH
を設定するための意図されたコマンドです。
2回目にディレクトリを追加したときは、コマンドにCR文字を入力しなかったため、コマンドは機能しました。出力を表示すると、CR文字は端末によって「行の先頭に戻る」ことを意味すると解釈されました。 CR文字の前後でまったく同じコンテンツがあったため、そのコンテンツは1回印刷されたように見えました。実際、同じ位置で2回印刷されました。
LinuxでLinux構成ファイルを編集するか、WindowsエディターにLinuxの行末を使用するように指示します(メモ帳よりも頭がおかしくないほとんどのテキストエディターで実行できます)。
違いがbash_profileとbashrcで説明されているman bash
セクションのファイルをご覧ください。
~/.bash_profile
The personal initialization file, executed for login shells
~/.bashrc
The individual per-interactive-Shell startup file
新しいシェルを開始していて、〜/ .bash_profileに入力したエントリがまったく使用されていないようです。
代わりに、〜/ .bash_rcファイルのエントリを設定してみてください。