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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
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 を使う理由はについては以下でしょうか。
- コンパイルが不要
- インストールが簡単
- 他のパッケージとの一貫性
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.09%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/01/23 13:20 編集
現状までお伝えさせて頂きたいと思います。
◆頂いた回答より行った作業
export PKG_CONFIG_PATH=/usr/local/src/Python-3.6.0/build/temp.linux-x86_64-3.6/libffi
を実行し、再度./setup.py install を実施。
エラーが以下のみになりました。
c/_cffi_backend.c:15:17: 致命的エラー: ffi.h: そのようなファイルやディレクトリはありません
include <ffi.h>
コンパイルを停止しました。
error: Setup script exited with error: command 'gcc' failed with exit status 1
その後以下のコマンドを実行し、再度./setup.py install を実施。
以下のエラー内容に変わりました。
CFLAGS=-I/usr/local/src/Python-3.6.0/build/temp.linux-x86_64-3.6/libffi/include
/bin/ld: -lffi が見つかりません
collect2: エラー: ld はステータス 1 で終了しました
error: Setup script exited with error: command 'gcc' failed with exit status 1
このようなエラーが出た際は、-l(今回で言うとffi)に続くライブラリをインストールすればよいという記事が見つかったのですが、
どこにそのライブラリがあるのかを探している状況です。
>これについては、ソースインストールをする必要があった事情というもの>がわからないと、答えにくいです。
脆弱性等が対策されている、全て最新バージョンのものを使用したかったというのが大きな理由です。
この場合も、pipを利用した方がメリットが高いでしょうか?
(質問ばかりとなり申し訳ありません。)
2017/01/23 15:14
http://www.sourceware.org/libffi/
脆弱性については、python3.5 系のほうが少ないかもしれませんね。基本的に脆弱性などは枯れているもの(の最新版)のほうが少ないのです。ややパッケージに入っているものが古いCentOSをサーバーように選ぶのもそのような理由でしょう。
yum でいれれば更新の管理を脆弱性が発見された時のディストリビュータが行ってくれることが多いです。しかし、自分でパッケージを入れた場合は、脆弱性情報を追いかけて更新しなくてはなりません。ディストーションのサポートが切れているのではなければ、yum で入れるのがおすすめです。
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バージョンアップ運用(手動で)があることを考慮するとシンボリックリンクの方がよさそうなので、そちらで行ってみます。
今回は大変参考になりました。本当にありがとうございます。
頂いたアドバイスを参考に今後に活かしたいと思います。