質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.65%

python paramikoインストール時のエラーについて

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,698

pacokio

score 16

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 <ffi.h>
コンパイルを停止しました。
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でのインストールとの作業比較、メリット、デメリットや、管理の違いを把握しておりません。
なぜ、ソースインストールするの?と感じる方がおりましたら、アドバイスを頂ければと考えております。)

以上になります。
お手数ですがご指摘、アドバイス宜しくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

正解は、このエラーメッセージに書かれているように、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 を使う理由はについては以下でしょうか。

  • コンパイルが不要
  • インストールが簡単
  • 他のパッケージとの一貫性

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/23 15:30

    ご回答ありがとうございます。

    ①python3.6をインストールした際にlibffi(の一部?)が含まれていたため、
    pythonモジュールの中にあるものでlibffiの中身がすべて賄えると思っていたのですが、そうではなく、今回のような場合はlibffiは単体でインストールする必要があるという理解で正しいでしょうか?

    ②脆弱性についてアドバイスありがとうございました。3.6の機能等を再確認し、一度導入するバージョンについては再検討させて頂きます。

    ③今回はパスを指定してインストールを行う形をとりましたが、
    パス指定をせず、シンボリックリンクをデフォルトパスに配置する方法でも設定としては問題ないでしょうか?
    例えば、今回はlibffi.pcを読み込みたいので、PKG_CONFIG_PATHで
    python3.6をインストールした該当フォルダパスを指定しましたが、
    デフォルトフォルダとなる/usr/lib64/pkgconfigにlibffi.pcのシンボリックリンクを配置するというやり方です。

    お手数をおかけしますが宜しくお願いします。

    キャンセル

  • 2017/01/23 15:38


    python をソースからインストールしたことはないのでわからないですが、libffiが含まれているのでしたら、そのバージョンのlibffiを使うのが良いと思います。
    find /usr/local/src/Python-3.6.0/build/temp.linux-x86_64-3.6/libffi -name "*.so"
    などで見つかるかもしれません。


    基本的には、シンボリックリンクで十分だと思います。
    というか、コピーしてもいいかもしれませんね。

    キャンセル

  • 2017/01/23 16:05

    ありがとうございます。

    ①find検索し、libffi.pcはありましたが、libffi.soは見つかりませんでした。
     なのでyum install で追加しようと思います。

    ②今後のOpenSSLバージョンアップ運用(手動で)があることを考慮するとシンボリックリンクの方がよさそうなので、そちらで行ってみます。


    今回は大変参考になりました。本当にありがとうございます。
    頂いたアドバイスを参考に今後に活かしたいと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.65%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る