2011-09-18 12 views
12

私が使用したいライブラリのサポートが不足しているため、私はいくつかのPython開発をWindowsからLinux開発に移しました。私は一日のうちに依存関係のないところにいらっしゃることを迷惑にしていました。どのようにLinux/Pythonの依存関係に対処するには?

質問

私は、Linuxを拾うたびに、私は通常、彼らは、apt-getをeasy_installをまたはPIPを介してインストールしているかどうかを、通常、開発ライブラリと、依存関係の問題のいくつかの種類に実行します。私はシンプルな作業でなければならないことを何日も無駄にして、コードを書くよりもライブラリを稼働させるのに長い時間を費やしています。 前に同じ問題を抱えている人のために無駄にグーグルグーグルではなく、これらの種類の問題に対処するための戦略については、どこで知ることができますか?


ほんの一例:私はいくつかのQRコードを生成したかったです。だから、pyqrcode.sourceforge.netに基づいていますが、Javaの依存関係がないと思われるgithub.com/bitly/pyqrencodeを使用すると思いました。他にも(pyqrnativegithub.com/Arachnid/pyqrencode)がありますが、私のニーズに最も適したもののようです。

だから、私はpypi上のパッケージを発見し、それが人生を容易にするだろう使用して考えた:(私はおそらくきちんと整頓物事を保つためにvirtualenvのを使って、自分の生活をより困難にしました)

(myenv3)[email protected]:~/myenv3$ bin/pip install pyqrencode 
Downloading/unpacking pyqrencode 
    Downloading pyqrencode-0.2.tar.gz 
    Running setup.py egg_info for package pyqrencode 

Installing collected packages: pyqrencode 
    Running setup.py install for pyqrencode 
    building 'qrencode' extension 
    gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/include/python2.7 -c qrencode.c -o build/temp.linux-i686-2.7/qrencode.o 
    gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions build/temp.linux-i686-2.7/qrencode.o -lqrencode -o build/lib.linux-i686-2.7/qrencode.so 

Successfully installed pyqrencode 
Cleaning up... 

(。私もその前にいくつかの時点で、私はおそらくsudo apt-get install libqrencode-dev推測)

だから、私は、テストスクリプトを実行しようとした:

(myenv3)[email protected]:~/myenv3$ python test_qr.py 
Traceback (most recent call last): 
    File "test_qr.py", line 1, in <module> 
    from qrencode import Encoder 
    File "qrencode.pyx", line 1, in init qrencode (qrencode.c:1520) 
ImportError: No module named ImageOps 

:(

まあ、investigationsはImageOpsはうーん、PILのは、インストール

(myenv3)[email protected]:~/myenv3$ pip install pil 
Downloading/unpacking pil 
    Downloading PIL-1.1.7.tar.gz (506Kb): 122Kb downloaded 
Operation cancelled by user 
Storing complete log in /home/mat/.pip/pip.log 
(myenv3)[email protected]:~/myenv3$ bin/pip install pil 
Downloading/unpacking pil 
    Downloading PIL-1.1.7.tar.gz (506Kb): 506Kb downloaded 
    Running setup.py egg_info for package pil 
    WARNING: '' not a valid package name; please use only.-separated package names in setup.py 

Installing collected packages: pil 
    Running setup.py install for pil 
    WARNING: '' not a valid package name; please use only.-separated package names in setup.py 
    building '_imaging' extension 
    gcc ... 
    building '_imagingmath' extension 
    gcc ... 
    -------------------------------------------------------------------- 
    PIL 1.1.7 SETUP SUMMARY 
    -------------------------------------------------------------------- 
    version  1.1.7 
    platform  linux2 2.7.1+ (r271:86832, Apr 11 2011, 18:05:24) 
        [GCC 4.5.2] 
    -------------------------------------------------------------------- 
    *** TKINTER support not available 
    *** JPEG support not available 
    *** ZLIB (PNG/ZIP) support not available 
    *** FREETYPE2 support not available 
    *** LITTLECMS support not available 
    -------------------------------------------------------------------- 
    To add a missing option, make sure you have the required 
    library, and set the corresponding ROOT variable in the 
    setup.py script. 

    To check the build, run the selftest.py script. 
    ... 
Successfully installed pil 
Cleaning up... 

... PILの一部であるように見えるが、私は以前sudo apt-get install libjpeg62 libjpeg62-dev libpng12-dev zlib1g zlib1g-devにインストールされたライブラリをピックアップしていないことを明らかにしました。私はpipにライブラリの場所をsetup.pyに送るようにpipに指示する方法がわかりません。グーグルでは、私が試した様々なideasを提案していますが、誰も私をサークルの周りに送ってくれること以外には何も役立たないようです。

Ubuntu 11.04: Installing PIL into a virtualenv with PIPではなくpillowパッケージを使用して提案し、その者はそれを試してみましょう:

(myenv3)[email protected]:~/myenv3$ pip install pillow 
Downloading/unpacking pillow 
    Downloading Pillow-1.7.5.zip (637Kb): 637Kb downloaded 
    Running setup.py egg_info for package pillow 

    ... 
Installing collected packages: pillow 
    Running setup.py install for pillow 
    building '_imaging' extension 
    gcc ... 
    -------------------------------------------------------------------- 
    SETUP SUMMARY (Pillow 1.7.5/PIL 1.1.7) 
    -------------------------------------------------------------------- 
    version  1.7.5 
    platform  linux2 2.7.1+ (r271:86832, Apr 11 2011, 18:05:24) 
        [GCC 4.5.2] 
    -------------------------------------------------------------------- 
    *** TKINTER support not available 
    --- JPEG support available 
    --- ZLIB (PNG/ZIP) support available 
    --- FREETYPE2 support available 
    *** LITTLECMS support not available 
    -------------------------------------------------------------------- 
    To add a missing option, make sure you have the required 
    library, and set the corresponding ROOT variable in the 
    setup.py script. 

    To check the build, run the selftest.py script. 
    ... 
Successfully installed pillow 
Cleaning up... 

まあ、我々はイェーイ、JPEGやPNGは、この時間をサポート持っているようです!

(myenv3)[email protected]:~/myenv3$ python test_qr.py 
Traceback (most recent call last): 
    File "test_qr.py", line 1, in <module> 
    from qrencode import Encoder 
    File "qrencode.pyx", line 1, in init qrencode (qrencode.c:1520) 
ImportError: No module named ImageOps 

まだ画像がありません。今私は困惑している、ImageOpsが枕から欠落している、またはそれはpilと一緒にそこにあった別の問題です。

+1

apt-get install python-imaging – jterrace

+0

@jerrace既に持っていますが、それはvirtualenvによって無効にされます--no-site-packages – Mat

+0

これはPILがインストール可能な2つの方法PIL名前空間内で、または個別のパッケージとして実行できます。 'pyqrencode'は' import ImageOps'または 'import PIL.ImageOps'を使っていますか?それを切り替えて再構築してみてください。 – agf

答えて

12

私はここで二つの別々の問題を参照してください。

  1. は、あなたのプロジェクトのために必要なすべてのpythonモジュールのトラックを維持します。

  2. プロジェクト内のPythonモジュールに必要なすべての動的ライブラリを追跡します。最初の問題については

、私はそれを把握するlitleしばらく時間がかかりますalthought buildoutは、良い助けであることを見出しました。

あなたの場合、私は新しいプロジェクト用のディレクトリを作成することから始めます。アイムこのbuildout.cfg

[buildout] 
parts = qrproject 
     python 
eggs = pyqrencode 

[qrproject] 
recipe = z3c.recipe.scripts 
eggs = ${buildout:eggs} 
entry-points= qrproject=qrprojectmodule:run 
extra-paths = ${buildout:directory} 

# This is a simple way of creating an interpreter that will have 
# access to all the eggs/modules that this project uses. 
[python] 
recipe = z3c.recipe.scripts 
interpreter = python 
eggs = ${buildout:eggs} 
extra-paths = ${buildout:directory} 

:私は、私はその後、buildout.cfgファイルを作成し、そのディレクトリに移動して、

wget http://python-distribute.org/bootstrap.py 

bootstrap.pyをダウンロードしますモジュールqrprojectmoduleのエントリポイント[qrproject])を参照してください。関数を実行するbin/qrprojectは、モジュールのqrprojectmoduleを実行します。だから私も今、それはあなたが使用したいのpythonのバイナリでbootstrap.pyを実行する時が来たファイルqrprojectmodule.py

import qrencode 

def run(): 
    print "Entry point for qrproject. Happily imports qrencode module" 

を作成します。

python bootstrap.py 

そして、生成されたを実行しますビン/ビルド

bin/buildout 

これで2つのadd bin/ディレクトリ - bin/qrprojectおよびbin/pythonにあるバイナリです。前者はプロジェクトの主なバイナリです。ビルドアウトを実行するたびに自動的に作成され、ロードするすべてのモジュールと卵があります。 2つ目は簡単なデバッグのために、すべてのモジュールと卵がロードされている場所でpythonプロンプトを表示する便利な方法です。ここでの素晴らしいことは、bin/buildoutが、卵(あなたの場合はpyqrencode)が依存関係として指定したPythonの卵を自動的にインストールすることです。

実際には、bin/buildoutを実行するステップでコンパイルエラーが発生する可能性があります。これは、問題2を解決する必要があるためです。すべてのダイナミックライブラリがシステムで使用可能になっています。 Linuxでは、通常、パッケージシステムの助けを得ることが最善です。ここではUbuntuなどのDebian派生物を使っていると仮定します。

pyqrencode Webサイトでは、pyqrencodeを動作させるためにlibqrencodeライブラリが必要であることを指定しています。だから私はそれを検索するために私のパッケージマネージャを使用:この場合

$ apt-cache search libqrencode 
libqrencode-dev - QR Code encoding library -- development 
libqrencode3 - QR Code encoding library 
qrencode - QR Code encoder into PNG image 

それはPythonのC-モジュールをコンパイルするために必要なリンク可能なライブラリとヘッダファイルをインストールするように、私は、-devパッケージが欲しいです。また、パッケージマネージャの依存システムは、libqrencode-devをインストールした場合、実行時、すなわちモジュールのコンパイル後に必要となるので、libqrencode3も取得するようにします。

だから、私はパッケージをインストールします。それが完了すると

sudo apt-get install libqrencode-dev 

、再放送のbin /増築とpyqrencodeモジュールは、(うまくいけば)コンパイルし、正常にインストールされます。今ビン/ qrproject

$ bin/qrproject 
Entry point for qrproject. Happily imports qrencode module 

成功を実行してみてください! :-)

ので、要約すると:

  1. 使用増築自動的にダウンロードし、あなたのプロジェクトのために必要なすべてのPythonモジュール/卵をインストールします。

  2. 使用しているPythonモジュールに必要なダイナミック(C)ライブラリをインストールするには、システムのパッケージマネージャを使用します。

多くの場合、既にパッケージシステムで使用できるPythonモジュールのパッケージ版があることに注意してください。例えば、pilは、python-imagingパッケージをUbuntuにインストールすることで利用できます。この場合、buildoutを使用してインストールする必要はなく、ライブラリが利用可能であることを心配する必要はありません。パッケージマネージャは、モジュールの実行に必要なすべての依存関係をインストールします。ただし、ビルドアウトを使用すると、プロジェクトを配布して他のシステムで実行することが容易になります。

+0

+100万 - すばらしい答え! – katrielalex

0

あなたのストーリーは、Linuxでの私の初期の経験を思い起こさせ、なぜ私がAPTを愛するのかを思い出させます。

一般的な問題の普遍的な解決策はありません。あなたができる最善のことは、仕事などを活用することです。 Debianのパッケージング担当者は、パッケージの依存関係にフラグを立てるという素晴らしい仕事をしているので、apt-getは必要なものを引きつけるでしょう。ですから、私の戦略は、自分のものを構築してインストールするのを避け、可能な限りapt-getを使うことです。

UbuntuはDebianをベースにしているため、Debianパッケージャの仕事のメリットが得られます。私はFedoraを使用していませんが、パッケージはDebianのものと同様に組織化されていないと聞いています。

+0

はい - "apt"はDebianベースのディストリビューション(Ubuntuを含む)に最適です。 "yum"も同様です(Redhat、Centos、SuSEなど)。 PS:あなたの主な目標は、 "apt-get install python-imaging"を修正することです。あなたはそれがうまくいくまであなたはかなりうんざりしています。あなたはそれが働いた後、家に帰るべきです。 – paulsm4

関連する問題