“致命错误:sql.h”;使用unixODBC和pyodbc作为供应商应用程序依赖项 [英] "fatal error: sql.h" with unixODBC and pyodbc as a vendor app dependency
问题描述
根据此处概述的注释,我正在尝试将unixODBC添加为供应商应用程序依赖项: https://github.com/cloudfoundry/python-buildpack/issues/34 ,但我仍然遇到致命错误:
I'm trying to add unixODBC as a vendor app dependency, as per notes that are outlined here: https://github.com/cloudfoundry/python-buildpack/issues/34, but I'm still getting fatal error:
sql.h:没有这样的文件或目录。
sql.h: No such file or directory.
我创建了一个最小的,可验证的,完整的以下脚本,以方便读者重现我的问题:
I've created a Minimal, Verifiable, Complete script below to facilitate readers with reproducing my issue:
mkdir new_app
cd new_app
cat <<EOF>requirements.txt
pyodbc==4.0.17
EOF
cat <<EOF>manifest.yml
applications:
- name: pyodbc-test
memory: 128M
EOF
cat <<EOF>.profile
export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:/app/vendor/unixodbc/lib
EOF
sudo docker run -it --rm -v ${PWD}:/app cloudfoundry/cflinuxfs2 bash -c \
"wget ftp://ftp.unixodbc.org/pub/unixODBC/unixODBC-2.3.4.tar.gz; tar xzf unixODBC-2.3.4.tar.gz; cd unixODBC-2.3.4; ./configure --prefix=/app/vendor/unixodbc; make; make install;"
接着:
sudo chown -R ${USER}:${USER} vendor/
pip3 download -r requirements.txt -d vendor/
cf push
cf推送输出:
...
-------> Buildpack version 1.5.15
! Warning: Your application is missing a Procfile. This file tells Cloud Foundry how to run your application.
! Learn more: https://docs.cloudfoundry.org/buildpacks/prod-server.html#procfile
-----> Installing python-2.7.13
Downloaded [file:///tmp/buildpack/dependencies/https___buildpacks.cloudfoundry.org_dependencies_python_python-2.7.13-linux-x64.tgz]
$ pip install -r requirements.txt
Collecting pyodbc==4.0.17 (from -r requirements.txt (line 1))
Installing collected packages: pyodbc
Running setup.py install for pyodbc: started
Running setup.py install for pyodbc: finished with status 'error'
Complete output from command /app/.heroku/python/bin/python -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-sxxn23/pyodbc/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-lRnuMu-record/install-record.txt --single-version-externally-managed --compile:
running build
running build_ext
building 'pyodbc' extension
creating build/temp.linux-x86_64-2.7
creating build/temp.linux-x86_64-2.7/src
gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -DPYODBC_VERSION=4.0.17 -I/app/.heroku/python/include/python2.7 -c src/errors.cpp -o build/temp.linux-x86_64-2.7/src/errors.o -Wno-write-strings
cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++ [enabled by default]
In file included from src/errors.cpp:2:0:
src/pyodbc.h:56:17: fatal error: sql.h: No such file or directory
#include <sql.h>
^
compilation terminated.
----------------------------------------
running install
creating build
error: command 'gcc' failed with exit status 1
Command "/app/.heroku/python/bin/python -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-sxxn23/pyodbc/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-lRnuMu-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-sxxn23/pyodbc/
Failed to compile droplet
Exit status 223
Staging failed: Exited with status 223
Destroying container
Successfully destroyed container
有这里是一个类似的问题:在IBM Bluemix服务器上安装pyodbc错误,但是那个这个问题与这个问题的不同之处在于它是非常通用的,而这个问题是在同一主题上,但是与一组非常特定的构建步骤有关。
There is a similar question here: pyodbc install on IBM Bluemix server error, however that question is different to this question in that it is very generic, whereas this question is on the same topic but relates to a very specific set of build steps.
更新::这是基于接受的答案的更新脚本:
Update: Here is the updated script based on the accepted answer:
mkdir new_app
cd new_app
cat <<EOF>environment.yml
name: pyodbc-test
dependencies:
- pyodbc
EOF
cat <<EOF>manifest.yml
applications:
- name: pyodbc-test
memory: 128M
EOF
cf push
推荐答案
src / pyodbc.h:56:17:致命错误:sql.h:没有这样的文件或目录#include
src/pyodbc.h:56:17: fatal error: sql.h: No such file or directory #include
您的设置通常看起来不错,但是在暂存期间运行 pip
时,构建工具仍无法找到库头。标题在那里,因为您将它们包含在 vendor /
目录中,但是它不知道它们是否存在,因为python模块的构建脚本不会在该位置查找它们。
Your setup generally looks OK, but when pip
runs during staging the build tools are still unable to find the library headers. The headers are there since you're including them in the vendor/
directory, but it doesn't know they're there as the build script for the python module won't look for them in that location.
我不知道有一种方法可以使它在非标准位置中查找标头而不修改构建包,因为< a href = https://stackoverflow.com/a/28981343/1585136>您需要向 pip
发送其他参数。
I don't know of a way to make it look for the headers in a non-standard location without modifying the build pack because you need to send additional arguments to pip
.
一些人建议将 CPATH
和/或 C_INCLUDE_PATH
环境变量设置为这些应该由 gcc
拾取,但是在我的测试中,这些被忽略了。
A few people suggested setting the CPATH
and/or C_INCLUDE_PATH
environment variables as these are supposed to get picked up by gcc
, but in my tests, these were ignored.
最后,我认为您最好的选择是使用Conda来安装pyodbc。
In the end, I think your best bet is to use Conda to install pyodbc. Here's how you'd go about that.
- 在其中添加
environment.yml
项目的根。 - 在其中添加以下内容:
- Add
environment.yml
to the root of your project. - In it add the following:
name: pyodbc-test
dependencies:
- pyodbc
- 运行
cf push
。
- Run
cf push
.
该构建包应在登台期间运行,安装miniconda,然后使用conda(尤其是pyodbc)安装依赖项。
The build pack should run during staging, install miniconda and then install your dependencies with conda, specifically pyodbc.
希望有帮助!
这篇关于“致命错误:sql.h”;使用unixODBC和pyodbc作为供应商应用程序依赖项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!