我正在开发一个需要SciPy,NumPy和scikit-learn的基于Raspberry的项目。我们需要将我们的虚拟环境打包在.deb中进行分发。为此,我们使用dh_virtualenv,到目前为止工作得很好。
当我在venv上安装我们的要求时,就像这样:
myvenv/bin/pip install numpy
myvenv/bin/pip install scipy
myvenv/bin/pip install sklearn
依赖关系安装得很好,尽管它们需要花费很长时间才能完成。
当我们尝试按照以下步骤制作包时出现问题:
mkdir myvenv-0.1
cd myvenv-0.1
dh_make --createorig
nano ./debian/rules
然后我找到" dh $ @"部分在编辑器中,我用这个
替换它%:
dh $@ --with python-virtualenv --python /path/to/myvenv/bin/python
然后我修改debian/control
:
nano ./debian/control
并填写:
Source: myvenv
Maintainer: My Name <mymail@mymail.com>
Build-Depends: debhelper (>= 9)
Standards-Version: 3.9.5
Homepage: <insert the upstream URL, if relevant>
Package: myvenv
Version: 0.1-1
Architecture: armhf
Pre-Depends: dpkg (>= 1.16.1), python2.7 | python2.6
Section: python
Priority: extra
Description: My Description
然后我冻结了我的要求:
/path/to/myvenv/bin/pip freeze > requirements.txt
纳米加入其中:
nano requirements.txt
然后我寻找myvenv需求行并删除它,否则venv需要自己,这会在以后打破整个过程(我知道这太好了。)
此时我为myvenv包生成了一个setup.py文件,该文件必须实现一个假的单元测试命令,因为dh_virtualenv默认尝试运行单元测试,并且禁用它们的标志不是没有工作。这是文件:
from distutils.core import setup
from distutils.cmd import Command
class TestCommand(Command):
user_options=[]
description = ''
def initialize_options(self):
pass
def finalize_options(self):
pass
def run(self):
self.announce('test')
setup(
cmdclass={
'test': TestCommand
},
name='myvenv',
version='0.1',
description='desc')
然后我导出需要安装myvenv的路径:
export DH_VIRTUALENV_INSTALL_ROOT=/path/
最后,我可以构建包,但我需要先提交,所以我做
dpkg-source --commit
我按字面意思给我的补丁任何名字然后按回车键,然后我:
dpkg-buildpackage -us -uc
这个程序运行得很好,直到现在我有一个python类自动执行此操作。
这些库也可以安装在venv本身上。
但是,无论出于何种原因,包装virtualenv只会导致gfortran爆炸。
错误回溯是巨大的,它基本上是这样结束的:
File "/path/to/myvenv-0.1/debian/myvenv/path/to/myvenv/lib/python3.4/site-packages/setuptools/command/easy_install.py", line 1066, in run_setup
raise DistutilsError("Setup script exited with %s" % (v.args[0],))
distutils.errors.DistutilsError: Setup script exited with error: Command "/usr/bin/gfortran -Wall -g -Wl,-z,relro build/temp.linux-armv7l-3.4/numpy/linalg/lapack_litemodule.o build/temp.linux-armv7l-3.4/numpy/linalg/lapack_lite/python_xerbla.o -L/usr/lib/atlas-base/atlas -L/usr/lib/atlas-base -L/usr/lib/gcc/arm-linux-gnueabihf/4.9 -L/usr/lib/gcc/arm-linux-gnueabihf/4.9 -Lbuild/temp.linux-armv7l-3.4 -llapack -lf77blas -lcblas -latlas -lf77blas -lcblas -lgfortran -o build/lib.linux-armv7l-3.4/numpy/linalg/lapack_lite.cpython-34m.so" failed with exit status 1
----------------------------------------
Cleaning up...
Command python setup.py egg_info failed with error code 1 in /tmp/pip-build-ouvtjhcw/scipy
Storing debug log for failure in /home/admin/.pip/pip.log
Traceback (most recent call last):
File "/usr/bin/dh_virtualenv", line 85, in <module>
sys.exit(main() or 0)
File "/usr/bin/dh_virtualenv", line 67, in main
deploy.install_dependencies()
File "/usr/lib/python2.7/dist-packages/dh_virtualenv/deployment.py", line 112, in install_dependencies
subprocess.check_call(self.pip('-r', requirements_path))
File "/usr/lib/python2.7/subprocess.py", line 540, in check_call
raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['debian/myvenv/path/to/myvenv/bin/python', 'debian/myvenv/path/to/myvenv/bin/pip', 'install', '--log=/tmp/tmpRjP02B', '-r', './requirements.txt']' returned non-zero exit status 1
debian/rules:22: recipe for target 'binary' failed
make: *** [binary] Error 1
dpkg-buildpackage: error: fakeroot debian/rules binary gave error exit status 2
进一步说它正在安装lapack_lite。抱歉,我不得不重新启动计算机,需要很长时间再次运行它。我只保留了最后一部分用于进一步的网络搜索(迄今为止没有发现任何内容。)
平台是Raspbian。 Python也是3.4.4版。 Pip是版本1.5.6
经过45分钟的纯粹幸福之后,我还有另一个日志。我有整个事情。事实上,我必须put it on pastebin这么大。
答案 0 :(得分:1)
TL; DR:使用piwheels。
我经历了很多努力解决这个问题,基本上我已经放弃了,直到我找到了piwheels。
它是合理的最新版本,也许你会得到scipy 1.0.0而不是1.0.1但真的,谁在乎。 它还可以大大减少打包你的静脉所需的时间。
只需在debian / rules文件中覆盖dh_virtualenv,如下所示:
[...]
override_dh_virtualenv:
dh_virtualenv --python /path/to/myvenv/bin/python -v --extra-index-url https://www.piwheels.org/simple
%:
[...]