Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何处理Linux/Python依赖关系?_Python_Linux_Dependencies_Dependency Management - Fatal编程技术网

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

如何处理Linux/Python依赖关系?,python,linux,dependencies,dependency-management,Python,Linux,Dependencies,Dependency Management,由于缺少对我想要使用的一些库的支持,我将一些Python开发从Windows转移到Linux开发。我花了一天的大部分时间都在纠结于依赖关系的问题 问题 每当我学习Linux时,我通常会遇到某种依赖性问题,通常是开发库,无论它们是通过apt get、easy_install还是pip安装的。我可以在应该是简单的任务上浪费几天时间,花更多的时间让库工作,而不是编写代码我在哪里可以了解处理此类问题的策略,而不是漫无目的地搜索以前遇到过相同问题的人? 示例 举个例子:我想生成一些二维码。所以,我想我会

由于缺少对我想要使用的一些库的支持,我将一些Python开发从Windows转移到Linux开发。我花了一天的大部分时间都在纠结于依赖关系的问题

问题

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


示例

举个例子:我想生成一些二维码。所以,我想我会使用它,它基于Java,但应该没有Java依赖关系。还有其他的(,),但那一个似乎是满足我需求的最佳选择

因此,我找到了包装,并认为使用它会使生活更轻松:

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

(我猜在这之前的某个时候,我可能
sudo也会安装libqrencode dev

然后我尝试运行测试脚本:

(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
嗯,PIL已经安装了,但还没有找到我之前用sudo apt get install libjpeg62 libjpeg62 dev libpng12 dev zlib1g zlib1g dev安装的库。我不知道如何告诉pip将库位置提供给setup.py。谷歌搜索提供了我尝试过的各种建议,但除了让我兜圈子之外,它们似乎都帮不了我什么忙

建议改用该软件包,让我们试试:

(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,耶

(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
(myenv3)mat@ubuntu:~/myenv3$python测试\u qr.py
回溯(最近一次呼叫最后一次):
文件“test_qr.py”,第1行,在
从qrencode导入编码器
文件“qrencode.pyx”,第1行,在init qrencode(qrencode.c:1520)中
ImportError:没有名为ImageOps的模块

不过还是没有。现在我被难住了,是枕头上的ImageOps丢失了,还是pil也存在另一个问题。

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

对你的一般问题没有普遍的解决办法;你能做的最好的事情就是利用工作或其他机会。Debian打包程序在标记包的依赖关系方面做得很好,因此apt get将引入您需要的内容。所以,我的策略就是避免自己构建和安装东西,并尽可能使用apt get


请注意,Ubuntu基于Debian,因此从Debian打包程序的工作中获益。我没有使用Fedora,但听说软件包的组织不如Debian的软件包好。

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

  • 跟踪项目所需的所有python模块

  • 跟踪项目中python模块所需的所有动态库

  • 对于第一个问题,我发现这是一个很好的帮助,尽管它需要一段时间才能掌握

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

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

    在此buildout.cfg中,我引用了模块qrprojectmodule(在[qrproject]下的入口点中)。这将创建一个bin/qrproject,运行在模块qrprojectmodule中运行的函数。因此,我还将创建文件qrprojectmodule.py

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

    python bootstrap.py
    
    然后运行生成的bin/buildout

    这将在bin/目录中创建两个额外的二进制文件-bin/qrproject和bin/python。前者是项目的主二进制文件。每次运行buildout时都会自动创建该二进制文件,并将加载所有要加载的模块和鸡蛋。第二个简单的方法是获取python提示符,其中显示所有模块和鸡蛋很好的一点是bin/buildout将自动安装任何python鸡蛋(在您的例子中是pyqrencode)指定为依赖项的python鸡蛋

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

    pyqrencode网站指定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
    
    在本例中,我需要-dev包,因为它安装了编译python C-modules所需的可链接库和头文件。此外,包管理器中的依赖关系系统将确保,如果我安装libqrencode dev,我还将获得libqrencode3,这是运行时(即编译模块后)所需的

    因此,我安装该软件包:

    sudo apt-get install libqrencode-dev
    
    完成后,重新运行bin/buildout,pyqrencode模块将(希望)编译并安装成功

    成功!:-)

    因此,总而言之:

  • 使用buildout自动下载并安装项目所需的所有python模块/鸡蛋

  • 使用系统的包管理器安装您使用的python模块所需的任何动态(C)库

  • 请注意,在许多情况下,包系统中已经有了python模块的打包版本。例如,可以通过在Ubuntu上安装python映像包来获得pil。在这种情况下,您不需要通过buildout安装它,也不需要担心库被删除
    [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}
    
    import qrencode
    
    def run():
        print "Entry point for qrproject. Happily imports qrencode module"
    
    python bootstrap.py
    
    bin/buildout
    
    $ apt-cache search libqrencode
    libqrencode-dev - QR Code encoding library -- development
    libqrencode3 - QR Code encoding library
    qrencode - QR Code encoder into PNG image
    
    sudo apt-get install libqrencode-dev
    
    $ bin/qrproject 
    Entry point for qrproject. Happily imports qrencode module