我需要在需要Python包dm.xmlsec.binding
的Heroku Django项目上运行代码。反过来,这取决于安装二进制apt
包libxmlsec1
,通常是通过apt-get install
。
这就是我在Ubuntu流浪盒上本地运行的东西。
我的应用程序中有两个“构建包”。使用heroku-buildpack-multi启用了多个构建包。
由于我的应用程序是Python应用程序,因此我的.buildpacks
内容为:
https://github.com/ddollar/heroku-buildpack-apt
https://github.com/heroku/heroku-buildpack-python
引用heroku-buildpack-apt的第一个buildpack需要Aptfile
来指定apt
个包;在我们的例子中,该文件的内容是:
python-setuptools
libxmlsec1
libxmlsec1-dev
swig
python-m2crypto
第二个buildpack是“Heroku buildpack for Python apps, powered by pip”。
到目前为止一切顺利。
问题在于,虽然apt
软件包看起来像是成功安装的,但是pip install
实际运行时,似乎没有找到安装的apt
软件包。
如果正确安装了apt
个软件包,为什么Python在后续的pip install
中找不到它们?
这是完整的git push heroku
日志:
git push heroku
Fetching repository, done.
Counting objects: 12, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (8/8), done.
Writing objects: 100% (9/9), 932 bytes | 0 bytes/s, done.
Total 9 (delta 3), reused 0 (delta 0)
-----> Fetching custom git buildpack... done
-----> Multipack app detected
=====> Downloading Buildpack: https://github.com/ddollar/heroku-buildpack-apt
=====> Detected Framework: Apt
-----> Updating apt caches
Ign http://archive.ubuntu.com trusty InRelease
Ign http://archive.ubuntu.com trusty-security InRelease
Ign http://archive.ubuntu.com trusty-updates InRelease
Hit http://archive.ubuntu.com trusty Release.gpg
Get:1 http://archive.ubuntu.com trusty-security Release.gpg [933 B]
Get:2 http://archive.ubuntu.com trusty-updates Release.gpg [933 B]
Hit http://archive.ubuntu.com trusty Release
Get:3 http://archive.ubuntu.com trusty-security Release [62.0 kB]
Get:4 http://archive.ubuntu.com trusty-updates Release [62.0 kB]
Hit http://archive.ubuntu.com trusty/main amd64 Packages
Hit http://archive.ubuntu.com trusty/universe amd64 Packages
Hit http://archive.ubuntu.com trusty/main Translation-en
Hit http://archive.ubuntu.com trusty/universe Translation-en
Get:5 http://archive.ubuntu.com trusty-security/main amd64 Packages [153 kB]
Hit http://archive.ubuntu.com trusty-security/main Translation-en
Get:6 http://archive.ubuntu.com trusty-updates/main amd64 Packages [356 kB]
Hit http://archive.ubuntu.com trusty-updates/main Translation-en
Fetched 635 kB in 2s (247 kB/s)
Reading package lists...
-----> Fetching .debs for python-setuptools
Reading package lists...
Building dependency tree...
The following extra packages will be installed:
python-pkg-resources
Suggested packages:
python-distribute python-distribute-doc
The following NEW packages will be installed:
python-pkg-resources python-setuptools
0 upgraded, 2 newly installed, 0 to remove and 38 not upgraded.
Need to get 292 kB of archives.
After this operation, 1017 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu/ trusty/main python-pkg-resources all 3.3-1ubuntu1 [61.9 kB]
Get:2 http://archive.ubuntu.com/ubuntu/ trusty/main python-setuptools all 3.3-1ubuntu1 [230 kB]
Fetched 292 kB in 0s (408 kB/s)
Download complete and in download only mode
-----> Fetching .debs for libxmlsec1
Reading package lists...
Building dependency tree...
The following NEW packages will be installed:
libxmlsec1
0 upgraded, 1 newly installed, 0 to remove and 38 not upgraded.
Need to get 0 B/115 kB of archives.
After this operation, 436 kB of additional disk space will be used.
Download complete and in download only mode
-----> Fetching .debs for libxmlsec1-dev
Reading package lists...
Building dependency tree...
The following extra packages will be installed:
libnspr4 libnspr4-dev libnss3 libnss3-dev libnss3-nssdb libxmlsec1
libxmlsec1-gcrypt libxmlsec1-gnutls libxmlsec1-nss libxmlsec1-openssl
The following NEW packages will be installed:
libnspr4 libnspr4-dev libnss3 libnss3-dev libnss3-nssdb libxmlsec1
libxmlsec1-dev libxmlsec1-gcrypt libxmlsec1-gnutls libxmlsec1-nss
libxmlsec1-openssl
0 upgraded, 11 newly installed, 0 to remove and 38 not upgraded.
Need to get 0 B/2579 kB of archives.
After this operation, 14.1 MB of additional disk space will be used.
Download complete and in download only mode
-----> Fetching .debs for swig
Reading package lists...
Building dependency tree...
The following extra packages will be installed:
swig2.0
Suggested packages:
swig-doc swig-examples swig2.0-examples swig2.0-doc
The following NEW packages will be installed:
swig swig2.0
0 upgraded, 2 newly installed, 0 to remove and 38 not upgraded.
Need to get 0 B/881 kB of archives.
After this operation, 4412 kB of additional disk space will be used.
Download complete and in download only mode
-----> Fetching .debs for python-m2crypto
Reading package lists...
Building dependency tree...
The following NEW packages will be installed:
python-m2crypto
0 upgraded, 1 newly installed, 0 to remove and 38 not upgraded.
Need to get 0 B/156 kB of archives.
After this operation, 831 kB of additional disk space will be used.
Download complete and in download only mode
-----> Installing libnspr4-dev_2%3a4.10.7-0ubuntu0.14.04.1_amd64.deb
-----> Installing libnspr4_2%3a4.10.7-0ubuntu0.14.04.1_amd64.deb
-----> Installing libnss3-dev_2%3a3.17.1-0ubuntu0.14.04.1_amd64.deb
-----> Installing libnss3-nssdb_2%3a3.17.1-0ubuntu0.14.04.1_all.deb
-----> Installing libnss3_2%3a3.17.1-0ubuntu0.14.04.1_amd64.deb
-----> Installing libxmlsec1-dev_1.2.18-2ubuntu1_amd64.deb
-----> Installing libxmlsec1-gcrypt_1.2.18-2ubuntu1_amd64.deb
-----> Installing libxmlsec1-gnutls_1.2.18-2ubuntu1_amd64.deb
-----> Installing libxmlsec1-nss_1.2.18-2ubuntu1_amd64.deb
-----> Installing libxmlsec1-openssl_1.2.18-2ubuntu1_amd64.deb
-----> Installing libxmlsec1_1.2.18-2ubuntu1_amd64.deb
-----> Installing python-m2crypto_0.21.1-3ubuntu5_amd64.deb
-----> Installing python-pkg-resources_3.3-1ubuntu1_all.deb
-----> Installing python-setuptools_3.3-1ubuntu1_all.deb
-----> Installing swig2.0_2.0.11-1ubuntu2_amd64.deb
-----> Installing swig_2.0.11-1ubuntu2_amd64.deb
-----> Writing profile script
=====> Downloading Buildpack: https://github.com/heroku/heroku-buildpack-python
=====> Detected Framework: Python
-----> Installing dependencies with pip
Downloading/unpacking dm.xmlsec.binding==1.3.1 (from -r requirements.txt (line 1))
Running setup.py (path:/tmp/pip_build_u45022/dm.xmlsec.binding/setup.py) egg_info for package dm.xmlsec.binding
Error: cannot get XMLSec1 pre-processor and compiler flags; do you have the `libxmlsec1` development package installed?
Complete output from command python setup.py egg_info:
Error: cannot get XMLSec1 pre-processor and compiler flags; do you have the `libxmlsec1` development package installed?
----------------------------------------
Cleaning up...
Command python setup.py egg_info failed with error code 1 in /tmp/pip_build_u45022/dm.xmlsec.binding
Storing debug log for failure in /app/.pip/pip.log
! Push rejected, failed to compile Multipack app
To git@heroku.com:xxxxxxxxxxx.git
! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'git@heroku.xxxxxxxxxxx.git'
答案 0 :(得分:1)
我不知道,但答案可能是this:
在@PadraicCunningham的惊人帮助下,我设法找到了解决方案。问题原来是heroku-buildpack-apt在新创建的文件夹/app/.apt/中安装了一些不在
PYTHONPATH
中的东西。所以我在heroku上将相关文件夹添加到我的PYTHONPATH中,如下所示:
heroku config:add PYTHONPATH=/app/.apt/usr/lib/python2.7/dist-packages/
答案 1 :(得分:0)
为了它的价值,我能够通过以下两件事来让xmlsec1在Heroku上工作:
$PATH
以指向xmlsec1二进制文件。使用buildpack安装xmlsec1
我使用heroku-buildpack-multi和strydercorp/heroku-buildpack-xmlsec buildpack将xmlsec1安装到我的Heroku实例中。请注意,此buildpack适用于Cedar14,如果您使用的是标准Cedar,则需要使用evenco/heroku-buildpack-xmlsec
以下是我的.buildpack
文件:
$ cat .buildpacks
https://github.com/heroku/heroku-buildpack-python
https://github.com/strydercorp/heroku-buildpack-xmlsec
使用.profile.d脚本配置$ PATH
在我的Heroku实例上安装xmlsec1二进制文件后,我需要配置$PATH
变量以指向xmlsec1二进制文件。以下是我过去使用的.profile.d
脚本:
$ cat .profile.d/path.sh
# https://devcenter.heroku.com/articles/profiled
# add xmlsec1 binary and libraries to the appropriate paths
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/app/.heroku/xmlsec1-1.2/lib/"
PATH="$PATH:/app/.heroku/xmlsec1-1.2/bin/"
答案 2 :(得分:0)
只要python中的任何软件包都存在OS依赖关系,我都更喜欢在Heroku上构建Docker映像以托管应用程序。
在您的根目录中创建一个Docker文件。 Docker文件如下所示:
FROM gcr.io/google-appengine/python
RUN apt-get update
RUN apt install libxmlsec1
RUN pip install requirements.txt
CMD python main.py
将所有想要的apt
命令写入docker文件中,并使用名称Dockerfile
保存。不要给文件名加上任何扩展名。
创建一个名为heroku.yml的文件。将以下代码行粘贴到它:
build:
docker:
web: Dockerfile
使用以下命令将您的应用程序推送到Heroku:
1。。git add heroku.yml
2 git commit -m“添加heroku.yml”
3 heroku stack:set容器
4 git push heroku master