- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
由于我想使用的一些库缺乏支持,我将一些Python开发从Windows转移到Linux开发。一天中的大部分时间,我都在为依赖项的无处可去而烦恼。
问题
每当我使用 Linux 时,我通常会遇到某种依赖性问题,通常是开发库,无论它们是通过 apt-get、easy_install 还是 pip 安装的。我可以在本应是简单的任务上浪费几天时间,花更多的时间在让库工作上而不是编写代码上。 我在哪里可以了解处理此类问题的策略,而不是漫无目的地在谷歌上搜索以前遇到过同样问题的人?
一个例子
仅举一个例子:我想生成一些二维码。所以,我想我会使用 github.com/bitly/pyqrencode这是基于 pyqrcode.sourceforge.net但据说没有 Java 依赖项。还有其他( pyqrnative 、 github.com/Arachnid/pyqrencode ),但那个似乎是满足我需求的最佳选择。
所以,我在 pypi 上找到了包裹并认为使用它会让生活更轻松:
(通过使用 virtualenv 来保持整洁,我可能让自己的生活变得更加困难。)
(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
。)
然后我尝试运行测试脚本:
(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
:(
嗯,investigations透露 ImageOps 似乎是 PIL 的一部分......
(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。谷歌搜索建议各种 ideas我已经尝试过了,但除了让我绕圈子之外,它们似乎没有太大帮助。
Ubuntu 11.04: Installing PIL into a virtualenv with PIP建议使用 pillow而是打包,所以让我们试试看:
(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
虽然仍然没有 ImageOps。现在我很困惑,pillow 中是否缺少 ImageOps,还是 pil 也存在其他问题。
最佳答案
我在这里看到两个不同的问题:
跟踪项目所需的所有 python 模块。
跟踪项目中 python 模块所需的所有动态库。
对于第一个问题,我发现buildout是很好的帮助,尽管需要一点时间才能掌握。
对于您的情况,我将从为我的新项目创建一个目录开始。然后我会进入该目录并下载 bootstrap.py
wget http://python-distribute.org/bootstrap.py
然后我会创建一个 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 中,我引用了模块 qrprojectmodule(在 [qrproject] 入口点中em>。这将在模块 qrprojectmodule 中创建一个运行函数 run 的 bin/qrproject。所以我还将创建文件 qrprojectmodule.py
import qrencode
def run():
print "Entry point for qrproject. Happily imports qrencode module"
现在是时候使用您要使用的 python 二进制文件运行 bootstrap.py 了:
python bootstrap.py
然后运行生成的bin/buildout
bin/buildout
这将在 bin/ 目录中创建两个额外的二进制文件 - bin/qrproject 和 bin/python。前者是您项目的主要二进制文件。它会在您每次运行 buildout 时自动创建,并将包含您想要加载的所有模块和蛋。第二种是获取 python 提示的简便方法,其中加载了所有模块和 egg,以便于调试。这里的好处是 bin/buildout 将自动安装 eggs(在你的例子中是 pyqrencode)指定为依赖项的任何 python eggs。
实际上,您可能会在运行 bin/buildout 的步骤中遇到编译错误。这是因为您需要解决问题 2:所有动态库都在您的系统上可用。在 Linux 上,通常最好从您的打包系统获得帮助。我假设您在这里使用的是 Debian 派生版本,例如 Ubuntu。
pyqrencode 网站指定您需要 libqrencode 库才能使 pyqrencode 工作。所以我用我的包管理器来搜索:
$ 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 模块所需的可链接库和头文件。此外,包管理器中的依赖系统将确保如果我安装 libqrencode-dev,我也会得到 libqrencode3,因为它在运行时需要,即在编译之后模块的。
所以,我安装包:
sudo apt-get install libqrencode-dev
完成后,重新运行 bin/buildout 并且 pyqrencode 模块将(希望)编译并成功安装。现在尝试运行 bin/qrproject
$ bin/qrproject
Entry point for qrproject. Happily imports qrencode module
成功了! :-)
所以,总结一下:
使用 buildout 自动下载并安装项目所需的所有 python 模块/egg。
使用系统的包管理器安装您使用的 python 模块所需的任何动态 (C) 库。
请注意,在许多情况下,包系统中已经提供了 python 模块的打包版本。例如,pil 可以通过在 Ubuntu 上安装 python-imaging 包获得。在这种情况下,您不需要通过 buildout 安装它,也不必担心库是否可用——包管理器将安装模块运行所需的所有依赖项。然而,通过构建来完成它可以更容易地分发您的项目并使其在其他系统上运行。
关于python - 如何处理 Linux/Python 依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7463530/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!