Fabric のインストールでこけたときに再インストールできない問題(Cent OS 6.5)
2014.11.12
こんにちは、ユニトラストの野口です。
最近 Capistrano から Fabric に浮気しています。
Python も使えるようになったらスキルの幅が広がるかなということで、 Fabric に手を出し始めました。
いつものように Fabric をクライアントマシンにインストールしようと思ったらハマったので、記録として残しておきたいと思います。
環境は CentOS 6.5 x86_64 です。
導入編
Python の業界では真っ先に以下のパッケージツールをインストールします。
- setuptools(easy_install)
- pip
かの有名な Amazon Web Services で提供されているコマンドラインクライアント AWS CLI も pip でインストールできるので、Python 製のツールを使うと言ったらこれらのインストールは暗黙の了解と言ってもよいかもしれません。
御多分にもれず Fabric も pip でインストールするのですが、以下のように普通にインストールしたらエラーとなりました。
setuptools(easy_install) のインストール
wget https://bootstrap.pypa.io/ez_setup.py -O - | sudo python
pip のインストール
sudo easy_install pip
Fabric のインストール
いつもなら簡単にインストールできるはずです・・・が、
$ sudo pip install fabric ... (snip) ... gcc -pthread -fno-strict-aliasing -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -fPIC -std=c99 -O3 -fomit-frame-pointer -Isrc/ -I/usr/include/python2.6 -c src/MD2.c -o build/temp.linux-x86_64-2.6/src/MD2.o src/MD2.c:31:20: error: Python.h: No such file or directory src/MD2.c:131: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token In file included from src/MD2.c:147: src/hash_template.c:48: error: expected specifier-qualifier-list before ‘PyObject_HEAD’ src/hash_template.c:59: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘PyTypeObject’ src/hash_template.c: In function ‘newALGobject’: src/hash_template.c:69: warning: implicit declaration of function ‘PyObject_New’ src/hash_template.c:69: error: expected expression before ‘ALGobject’ src/hash_template.c: At top level: src/hash_template.c:76: error: expected ‘)’ before ‘*’ token src/hash_template.c:91: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token src/hash_template.c:110: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token src/hash_template.c:122: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token src/hash_template.c:162: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token src/hash_template.c:188: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token src/hash_template.c:190: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘ALG_methods’ src/hash_template.c:199: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token src/hash_template.c:225: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘ALGtype’ src/hash_template.c:271: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token src/hash_template.c:304: error: array type has incomplete element type src/hash_template.c:305: error: ‘PyCFunction’ undeclared here (not in a function) src/hash_template.c:305: error: expected ‘}’ before ‘ALG_new’ src/hash_template.c: In function ‘init_MD2’: src/hash_template.c:339: error: ‘PyObject’ undeclared (first use in this function) src/hash_template.c:339: error: (Each undeclared identifier is reported only once src/hash_template.c:339: error: for each function it appears in.) src/hash_template.c:339: error: ‘m’ undeclared (first use in this function) src/hash_template.c:351: error: ‘ALGtype’ undeclared (first use in this function) src/hash_template.c:351: error: ‘PyType_Type’ undeclared (first use in this function) src/hash_template.c:352: warning: implicit declaration of function ‘Py_InitModule’ src/hash_template.c:356: error: ‘o’ undeclared (first use in this function) src/hash_template.c:356: warning: implicit declaration of function ‘PyInt_FromLong’ src/hash_template.c:356: warning: implicit declaration of function ‘PyDict_SetItemString’ src/hash_template.c:356: warning: implicit declaration of function ‘PyModule_GetDict’ src/hash_template.c:356: warning: implicit declaration of function ‘Py_DECREF’ src/hash_template.c:360: warning: implicit declaration of function ‘PyErr_Occurred’ src/hash_template.c:361: warning: implicit declaration of function ‘Py_FatalError’ error: command 'gcc' failed with exit status 1 ---------------------------------------- Cleaning up... Command /usr/bin/python -c "import setuptools, tokenize;__file__='/tmp/pip_build_root/pycrypto/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-5Gv280-record/install-record.txt --single-version-externally-managed --compile failed with error code 1 in /tmp/pip_build_root/pycrypto Traceback (most recent call last): File "/usr/bin/pip", line 9, in load_entry_point('pip==1.5.6', 'console_scripts', 'pip')() File "/usr/lib/python2.6/site-packages/pip-1.5.6-py2.6.egg/pip/__init__.py", line 185, in main return command.main(cmd_args) File "/usr/lib/python2.6/site-packages/pip-1.5.6-py2.6.egg/pip/basecommand.py", line 161, in main text = '\n'.join(complete_log) UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 35: ordinal not in range(128)
エラーを吐いて終了していしまいました。
Python.h
が存在しなくてビルドエラーとなっているため、 Python の開発ヘッダーが不足していることがわかります。
以下のよう yum でインストールして対応します。
sudo yum -y install python-devel
そしてインストールが失敗したんだから再度インストール走らせなければいけないよね、と思って再度インストールを走らせたらあっさりと終わってしまいました。
$ sudo pip install fabric Requirement already satisfied (use --upgrade to upgrade): fabric in /usr/lib/python2.6/site-packages Requirement already satisfied (use --upgrade to upgrade): paramiko>=1.10 in /usr/lib/python2.6/site-packages (from fabric) Cleaning up...
不審に思い fab コマンドを叩いてみると、
$ fab Traceback (most recent call last): File "/usr/bin/fab", line 5, in from pkg_resources import load_entry_point File "build/bdist.linux-x86_64/egg/pkg_resources.py", line 2880, in File "build/bdist.linux-x86_64/egg/pkg_resources.py", line 432, in _build_master File "build/bdist.linux-x86_64/egg/pkg_resources.py", line 741, in require File "build/bdist.linux-x86_64/egg/pkg_resources.py", line 626, in resolve pkg_resources.DistributionNotFound: ecdsa>=0.11
エラーを吐き出してコマンドが終了してしまいました。
インストールできてないじゃないですかー!やだー!
小一時間悩みましたが、これはキャッシュが悪さしている可能性が高いと思い、キャッシュを無視して再インストールするオプション --ignore-installed
をつけたらビルドからやり直してインストールしてくれました。
いったんアンインストール
sudo pip uninstall fabric
オプションつけて再インストール
sudo pip install --ignore-installed fabric
動作確認
$ fab --version Fabric 1.10.0 Paramiko 1.15.1
うまくインストール出来ました!
References
CONTACT
お問い合わせ
あなたの「想い」に挑戦します。
どうぞお気軽にお問い合わせください。
受付時間:平日9:00〜18:00 日・祝日・弊社指定休業日は除く