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スクリプトの最後の行に最初のエクスポートを追加すると(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/
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)
ベストアンサー1
私の修正には、Windowsコンピュータでファイルを編集しているようです。
WindowsとLinuxでは、改行文字を表現する方法が異なります。 Linux(すべてのUNIXシステムと同様)では、行は\n
改行文字(LF == Ctrl + J)で終わる一連の文字で構成されています。 Windowsでは、行はキャリッジリターンと改行(CRLF == \r\n
Ctrl + M Ctrl + J)の2文字の順序で区切られます。
ファイルには、export PATH=…
コマンド、CR、LF、およびexport LD_LIBRARY_PATH
末尾に改行なしのコマンドが含まれています。 Linuxプログラムの場合、同じバイトシーケンスはexport PATH=…
最後にCR文字、改行文字、埋め込み未完行を意味しますexport PATH=…
。シェルは、PATH
名前がCR文字で終わるディレクトリを追加する最初のコマンドを忠実に実行します。その名前のディレクトリがないため、変更はPATH
適用されません。その後、シェルは部分的な行を完全な行として扱います。これはsetに期待されるコマンドですLD_LIBRARY_PATH
。
2番目にディレクトリを追加すると、コマンドにCR文字を入力しないため、コマンドは機能します。出力を表示すると、端末はCR文字を「行の先頭に戻す」と解釈します。 CR文字の前後の内容はまったく同じなので、内容は一度印刷されたように見えますが、実際には同じ位置に2回印刷されます。
LinuxでLinux構成ファイルを編集するか、WindowsエディタにLinux行末を使用するように指示します(メモ帳よりも脳の少ないほとんどのテキストエディタでこれを行うことができます)。