質問: python初心者の為、以下の内容について行き詰っております。 お手数ですが、ご指摘、アドバイスなどを頂ければ幸いです。 ◆環境 OS:CentOS7.3.1611 OpenSSL1.0.2j Python3.6.0 上記2つをソースインストールしました。 上記環境から、pythonライブラリのparamikoのソースインストールを行おうとしています。 その際に以下のエラーが発生しました。 ◆エラー発生時の実行コマンド /usr/local/python3.6.0/bin/python3 ./setup.py install (解凍処理は済んだ状態で、./setup.py buildまで終えております。) ◆エラー内容 Package libffi was not found in the pkg-config search path. Perhaps you should add the directory containing `libffi.pc' to the PKG_CONFIG_PATH environment variable No package 'libffi' found c/_cffi_backend.c:15:17: 致命的エラー: ffi.h: そのようなファイルやディレクトリはありません include コンパイルを停止しました。 error: Setup script exited with error: command 'gcc' failed with exit status 1 ◆考察 libffiが見当たらないということで、 findした所、以下パスにlibffiを発見しました。 /usr/local/src/Python-3.6.0/build/temp.linux-x86_64-3.6/libffi パスが見えていないのであれば追加すればよいかと思い、以下のコマンドを実行しました。 export PATH=/usr/local/pgsql/bin:$PATH しかし、事象改善には至りませんでした。 次にyum install libffi-develを実行し、 ./setup.py installを実施した所事象改善しました。 gccについては、yum install gccを行ったところ最新状態でした。 ◆疑問 pythonのソースファイルにlibffiが含まれているのに、 yum install libffi-devel で新たにlibffiを持ってくるのは、 バージョン差異が起こり正しくないのではと考えております。 ./setup.py install時に、python3.6のlibffiを見に行かせる方法は、 export PATHでは無くほかの方法があるのではと考えていますが、 その方法が分からない状態です。その方法をお教えいただきたいと考えております。 (また、今回事情があり、ソースインストールを行っておりますが、easy_install、pipでのインストールとの作業比較、メリット、デメリットや、管理の違いを把握しておりません。 なぜ、ソースインストールするの?と感じる方がおりましたら、アドバイスを頂ければと考えております。) 以上になります。 お手数ですがご指摘、アドバイス宜しくお願いいたします。
回答: 正解は、このエラーメッセージに書かれているように、libffi.pc を含むディレクトリを PKG_CONFIG_PATH に追加することでした。 > > Package libffi was not found in the pkg-config search path. > > Perhaps you should add the directory containing `libffi.pc' > > to the PKG_CONFIG_PATH environment variable > > No package 'libffi' found > > > 以下にpacokioさんの疑問点について回答していきます。 > > pythonのソースファイルにlibffiが含まれているのに、 > > yum install libffi-devel で新たにlibffiを持ってくるのは、 > > バージョン差異が起こり正しくないのではと考えております。 > > > これについては、そのとおりです。ソースに含まれているバージョンより、libffi-devel が古い可能性があります。 しかし、今回はlibffi-develをインストールする際に パッケージの libffi がインストールされ、それが使われている可能性が高いです。理由は、PKG_CONFIG_PATHを設定していないため、環境のlibffiが使われたからです。 > > ./setup.py install時に、python3.6のlibffiを見に行かせる方法は、 > > export PATHでは無くほかの方法があるのではと考えていますが、 > > その方法が分からない状態です。その方法をお教えいただきたいと考えております。 > > > Windows では動的リンクライブラリ(DLL)を見に行くために、環境変数PATHを使います。 しかし、Linux では共有オブジェクト(SO)を見に行くために環境変数 LD_LIBRARY_PATH を使います。 > > (また、今回事情があり、ソースインストールを行っておりますが、easy_install、pipでのインストールとの作業比較、メリット、デメリットや、管理の違いを把握しておりません。 > > なぜ、ソースインストールするの?と感じる方がおりましたら、アドバイスを頂ければと考えております。) > > > これについては、ソースインストールをする必要があった事情というものがわからないと、答えにくいです。 一般的にはソースインストールをしなければならない理由としては、 * 理由によりパッケージよりあたらしいものが必要 * 互換性のために、パッケージより古い特定のバージョンが必要 * 最適化が必要 などがあると思います。 pip を使う理由はについては以下でしょうか。 * コンパイルが不要 * インストールが簡単 * 他のパッケージとの一貫性