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

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

新規登録して質問してみよう
ただいま回答率
85.48%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

10072閲覧

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

pacokio

総合スコア18

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2017/01/19 02:35

編集2017/01/19 02:36

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

正解は、このエラーメッセージに書かれているように、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/19 07:43

編集2017/01/19 07:46
MasashiKimura

総合スコア1150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pacokio

2017/01/23 04:37 編集

ご回答ありがとうございました。解決まで至っておりませんが、 現状までお伝えさせて頂きたいと思います。 ◆頂いた回答より行った作業 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を利用した方がメリットが高いでしょうか? (質問ばかりとなり申し訳ありません。)
MasashiKimura

2017/01/23 06:14

libffi です。 http://www.sourceware.org/libffi/ 脆弱性については、python3.5 系のほうが少ないかもしれませんね。基本的に脆弱性などは枯れているもの(の最新版)のほうが少ないのです。ややパッケージに入っているものが古いCentOSをサーバーように選ぶのもそのような理由でしょう。 yum でいれれば更新の管理を脆弱性が発見された時のディストリビュータが行ってくれることが多いです。しかし、自分でパッケージを入れた場合は、脆弱性情報を追いかけて更新しなくてはなりません。ディストーションのサポートが切れているのではなければ、yum で入れるのがおすすめです。
pacokio

2017/01/23 06:30

ご回答ありがとうございます。 ①python3.6をインストールした際にlibffi(の一部?)が含まれていたため、 pythonモジュールの中にあるものでlibffiの中身がすべて賄えると思っていたのですが、そうではなく、今回のような場合はlibffiは単体でインストールする必要があるという理解で正しいでしょうか? ②脆弱性についてアドバイスありがとうございました。3.6の機能等を再確認し、一度導入するバージョンについては再検討させて頂きます。 ③今回はパスを指定してインストールを行う形をとりましたが、 パス指定をせず、シンボリックリンクをデフォルトパスに配置する方法でも設定としては問題ないでしょうか? 例えば、今回はlibffi.pcを読み込みたいので、PKG_CONFIG_PATHで python3.6をインストールした該当フォルダパスを指定しましたが、 デフォルトフォルダとなる/usr/lib64/pkgconfigにlibffi.pcのシンボリックリンクを配置するというやり方です。 お手数をおかけしますが宜しくお願いします。
MasashiKimura

2017/01/23 06:38

① python をソースからインストールしたことはないのでわからないですが、libffiが含まれているのでしたら、そのバージョンのlibffiを使うのが良いと思います。 find /usr/local/src/Python-3.6.0/build/temp.linux-x86_64-3.6/libffi -name "*.so" などで見つかるかもしれません。 ③ 基本的には、シンボリックリンクで十分だと思います。 というか、コピーしてもいいかもしれませんね。
pacokio

2017/01/23 07:05

ありがとうございます。 ①find検索し、libffi.pcはありましたが、libffi.soは見つかりませんでした。  なのでyum install で追加しようと思います。 ②今後のOpenSSLバージョンアップ運用(手動で)があることを考慮するとシンボリックリンクの方がよさそうなので、そちらで行ってみます。 今回は大変参考になりました。本当にありがとうございます。 頂いたアドバイスを参考に今後に活かしたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問