“致命错误:sql.h”;使用unixODBC和pyodbc作为供应商应用程序依赖项 [英] "fatal error: sql.h" with unixODBC and pyodbc as a vendor app dependency

查看:342
本文介绍了“致命错误:sql.h”;使用unixODBC和pyodbc作为供应商应用程序依赖项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

根据此处概述的注释,我正在尝试将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.


  1. 在其中添加 environment.yml 项目的根。

  2. 在其中添加以下内容:

  1. Add environment.yml to the root of your project.
  2. In it add the following:



name: pyodbc-test
dependencies:
- pyodbc




  1. 运行 cf push

  1. 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆