Python 2.7 in Ubuntu 14.04.2のPycURL https://
で'PycURL/7.19.3 libcurl/7.35.0 GnuTLS/2.12.23 zlib/1.2.8 libidn/1.28 librtmp/2.3'
URLからダウンロードしようとすると、
pycurl.error: (35, 'gnutls_handshake() failed: Handshake failed')
ただし、curl
は正常に機能します。おそらくopenssl
を使用しているためです。
$ curl --version
curl 7.35.0 (x86_64-pc-linux-gnu) libcurl/7.35.0 OpenSSL/1.0.1f zlib/1.2.8 libidn/1.28 librtmp/2.3
したがって、openssl
へのPycURLバインディングも好みます。 python-pycurl
を再インストールしようとしました
export PYCURL_SSL_LIBRARY=openssl
Sudo apt-get remove python-pycurl
Sudo apt-get install python-pycurl
同様の質問で頻繁にアドバイスされますが、pycurl
はopenssl
にもバインドされていません。 apt-get remove
およびeasy_install
などと同じ.
質問:openssl
バインディングでPycURLを取得する方法は?
ボーナス質問:GnuTLSバインディングがとにかく機能しないように見えるので、PycURLがopenssl
バインディングと共にすぐにインストールされないのはなぜですか?
私はほとんど理解していないことやコンパイルなどの指示に従わずにこれが解決できることを心から望んでいました。しかし残念ながら...
手順については、2014年の this Gist を参照してください。
執筆時点では、Ubuntu Trusty 14.04.2 LTSを使用してもバージョンは同じであるため、7.19.3
なので、Gistの指示を1つずつ実行できます。スポットチェックは大丈夫で、カールはまだhttps://
で動作しています。レシピをステップスルーすると、pycurl.version
が表示されます
PycURL/7.19.3 libcurl/7.35.0 OpenSSL/1.0.1f zlib/1.2.8 libidn/1.28 librtmp/2.3
ダウンロード、パッチ適用、コンパイルを自動化するには、次の小さなスクリプトが便利です。
#!/bin/bash
#
# How to rebuild PycURL against OpenSSL on Ubuntu
# (tested for 14.04.2 now)
#
# This script implements the great Gist by aerickson:
# https://Gist.github.com/aerickson/f15133a7e56b2d7f27e3
# feel free to use it anyway you like.
# Credits go to Andrew anyway :)
#
# we will add some colored headers that make it easier to find obstacles
# in the terminal output (which will be > 1000 lines...)
ESC="\x1b["
RESET=$ESC"39;49;00m"
RED=$ESC"31;01m"
GREEN=$ESC"32;01m"
YELLOW=$ESC"33;01m"
BLUE=$ESC"34;01m"
header() {
echo -e "\n$YELLOW --- $1 --- $RESET\n"
}
echo -e "\n\n$GREEN"
echo -e "\
Build pycurl with openssl support\n\n\
Section numbers refer to\n\
https://Gist.github.com/aerickson/f15133a7e56b2d7f27e3
"
echo -e "$RESET\n"
# remove eventually existing pycurl
header "0. remove python-pycurl"
Sudo apt-get remove python-pycurl --yes
header "1. install build essentials"
Sudo apt-get install build-essential fakeroot dpkg-dev --yes
header "2./3. make build dir"
mkdir ~/python-pycurl-openssl
cd ~/python-pycurl-openssl
if [ ! "$HOME/python-pycurl-openssl" = `pwd` ]; then
echo -e "\n${RED}Cannot change to working dir. WTF?${RESET}\n"
exit 1
fi
header "4. get pycurl sources"
Sudo apt-get source python-pycurl --yes
header "5. get build dependencies for python-pycurl"
Sudo apt-get build-dep python-pycurl --yes
header "6. install libcurl with openssl"
Sudo apt-get install libcurl4-openssl-dev --yes
DIR=`find * -name 'pycurl*' -type d -print`
DSC=`find * -name '*.dsc' -type f -print`
echo
echo "DIR = $DIR"
echo "DSC = $DSC"
echo
header "7. unpack source archive"
Sudo dpkg-source -x $DSC
header "8. change to package dir"
cd $DIR
header "9. edit debian/control file"
Sudo cp debian/control ./control.gnutls
Sudo cat ./control.gnutls | sed -e 's|libcurl4-gnutls-dev|libcurl4-openssl-dev|' | Sudo tee ./control.openssl >/dev/null
Sudo cp ./control.openssl debian/control
header "10. build package"
echo "hold on..."
echo "(crashdump of nosetests is 'normal')"
Sudo PYCURL_SSL_LIBRARY=openssl dpkg-buildpackage -rfakeroot -b 2>&1 | Sudo tee ../buildlog.txt >/dev/null
echo
echo -e $BLUE
Sudo head ../buildlog.txt
echo -e $RESET
echo " [ ... 1000+ more messages omitted ... ]"
echo -e $BLUE
Sudo tail ../buildlog.txt
echo -e $RESET
echo
echo "find more output in ~/python-pycurl-openssl/buildlog.txt:"
wc -l ../buildlog.txt
header "11. install via package manager"
Sudo dpkg -i ../python-pycurl_*.deb
echo
echo "some other packages are available also now:"
ls ../*.deb
echo "they can be installed by 'Sudo dpkg -i ../py...' from here."
ただし、新しいバージョン7.19.5
がレポジトリになり、 が想定される GnuTLSで修正された問題があるため、PycURLはボックス。それでも問題は残っています。なぜこの問題がリポジトリにあるのか 2009年以来 誰も気にしません...
アップデートの問題
面白いことに、pycurl/libcurlのその後の定期的なUbuntu更新は、変更を上書きします。したがって、これを何度も繰り返す準備をしてください:(
または、python-pycurl
を保留afterにして、openssl
でビルドして、apt-get update
がそれを上書きしないようにすることができます。
Sudo apt-mark hold python-pycurl
更新は後で再有効化できます
Sudo apt-mark unhold python-pycurl
ラズベリーレシピ
上記のスクリプトは、前にソースをインストールする機能を追加すると、Raspberry Wheezyを搭載したRaspberry Piでも正常に動作します
Sudo nano /etc/apt/sources.list
deb-src
行のコメントを外して、ファイルが次のようになるようにします
deb http://mirrordirector.raspbian.org/raspbian/ wheezy main contrib non-free rpi
# Uncomment line below then 'apt-get update' to enable 'apt-get source'
deb-src http://archive.raspbian.org/raspbian/ wheezy main contrib non-free rpi
(ステップ4で)ソースが見つからない場合は、
Sudo apt-get update
上記のスクリプトを実行する前に。
注:Raspberryの場合、プロセスはプロセッサーの速度に少し影響を受けるため、30分はかかります(すべてがスムーズに機能する場合)。また、python-pycurl
を保留にするか、更新のたびにこの30分を再度投資する必要があります。