首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理Linux/Python依赖关系?

如何处理Linux/Python依赖关系?
EN

Stack Overflow用户
提问于 2011-09-18 18:36:03
回答 2查看 10K关注 0票数 14

由于对我想要使用的一些库缺乏支持,我将一些Python开发从Windows迁移到Linux开发。我花了一天的大部分时间在依赖关系上无所作为。

问题

每当我使用Linux时,我通常会遇到某种依赖问题,通常是使用开发库,无论它们是通过apt、easy_install还是pip安装的。我可以在应该是简单的任务上浪费时间,花更长的时间让库工作,而不是编写代码。,我在哪里可以学到处理这类问题的策略,而不是漫无目的地搜索那些以前遇到过同样问题的人?

示例

举一个例子:我想生成一些QR代码。所以,我想我应该使用github.com/bitly/pyqrencode,它是基于pyqrcode.sourceforge.net的,但应该没有pyqrcode.sourceforge.net依赖关系。还有其他的(吡喹酮github.com/Arachnid/pyqrencode),但这似乎是满足我需求的最佳选择。

因此,我在皮皮上找到了这个包,并认为使用它可以使生活更轻松:

(我可能通过使用virtualenv来保持整洁,使自己的生活变得更加困难。)

代码语言:javascript
复制
(myenv3)mat@ubuntu:~/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。)

于是我试着运行测试脚本:

代码语言:javascript
复制
(myenv3)mat@ubuntu:~/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的一部分.

代码语言:javascript
复制
(myenv3)mat@ubuntu:~/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)mat@ubuntu:~/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。谷歌建议使用我尝试过的各种想法,但它们似乎除了让我绕圈转之外,没有什么能起到很大作用。

Ubuntu11.04:使用PIP将PIL安装到虚拟环境中建议使用包,所以让我们试试:

代码语言:javascript
复制
(myenv3)mat@ubuntu:~/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的支持,耶!

代码语言:javascript
复制
(myenv3)mat@ubuntu:~/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。现在我很困惑,是ImageOps从枕头上不见了,还是另一个问题,也是皮尔的问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-18 19:36:37

我在这里看到两个不同的问题:

  1. 跟踪项目所需的所有python模块。
  2. 跟踪项目中的python模块所需的所有动态库。

对于第一个问题,我发现积木是很好的帮助,尽管它需要一小部分时间来掌握。

在您的例子中,我首先为我的新项目创建一个目录。然后我将进入该目录并下载bootstrap.py。

代码语言:javascript
复制
wget http://python-distribute.org/bootstrap.py 

然后我将创建一个buildout.cfg文件:

代码语言:javascript
复制
[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中,我引用模块qrproject模块(在qrproject下的入口点)。这将创建一个bin/qrproject,它运行模块qrprojectmodule中运行的函数。因此,我还将创建文件qrprojectmodule.py

代码语言:javascript
复制
import qrencode

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

现在是使用您想要使用的python二进制文件运行bootstrap.py的时候了:

代码语言:javascript
复制
python bootstrap.py

然后运行生成的bin/buildout

代码语言:javascript
复制
bin/buildout

这将在bin/目录- bin/qrproject和bin/python中创建另外两个二进制文件。前者是项目的主要二进制文件。每次运行buildout时,都会自动创建它,并将加载所有的模块和鸡蛋。第二种方法只是获得python提示符的一种方便方法,在这里加载了所有模块和蛋,以便进行轻松的调试。这里的好处是bin/buildout将自动安装鸡蛋(在您的例子中是pyqrencode)指定为依赖项的任何python鸡蛋。

实际上,在运行bin/buildout的步骤中可能会出现编译错误。这是因为您需要解决问题2:系统上所有的动态库都可用。在Linux上,通常最好是从打包系统获得帮助。我假设您使用的是Debian衍生工具,比如这里的Ubuntu。

pyqrencode网站指定需要libqrencode库才能工作。所以我用我的包管理器来搜索:

代码语言:javascript
复制
$ apt-cache search libqrencode
libqrencode-dev - QR Code encoding library -- development
libqrencode3 - QR Code encoding library
qrencode - QR Code encoder into PNG image

在本例中,我需要-dev包,因为它安装编译python模块所需的可链接库和头文件。此外,包管理器中的依赖系统将确保如果我安装libqrencode-dev,我也将获得libqrencode3,这是运行时所需的,即在编译模块之后。

所以,我安装了这个软件包:

代码语言:javascript
复制
sudo apt-get install libqrencode-dev

一旦完成,重新运行bin/buildout,pyqrencode模块将(希望)成功编译和安装。现在尝试运行bin/qrproject

代码语言:javascript
复制
$ bin/qrproject 
Entry point for qrproject. Happily imports qrencode module

成功!:)

因此,总括而言:

  1. 使用buildout自动下载和安装项目所需的所有python模块/鸡蛋。
  2. 使用系统的包管理器安装您使用的python模块所需的任何动态(C)库。

请注意,在许多情况下,包系统中已经有您的python模块的打包版本。例如,通过在Ubuntu上安装python映像包,可以获得pil。在本例中,您不需要通过buildout安装它,也不需要担心库是否可用--包管理器将安装模块运行所需的所有依赖项。然而,通过构建实现它可以使您的项目更容易分发,并使其在其他系统上运行。

票数 13
EN

Stack Overflow用户

发布于 2011-09-18 19:05:55

你的故事让我想起了我早期使用Linux的经历,以及我为什么喜欢APT。

对于你的一般问题,没有普遍的解决办法;你能做的最好的就是利用你的工作或其他人。Debian软件包在标记包的依赖关系方面做得很好,所以apt-get将吸引您所需的东西。所以,我的策略就是避免自己构建和安装东西,只要有可能就使用apt-get。

请注意,Ubuntu基于Debian,因此可以从Debian包器的工作中获益。我没有使用Fedora,但我听说这些包的组织不如Debian的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7463530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档