cloud-foundry - "fatal error: sql.h"与 unixODBC 和 pyodbc 作为供应商应用程序依赖项

标签 cloud-foundry

我正在尝试将 unixODBC 添加为供应商应用程序依赖项,按照此处概述的注释:https://github.com/cloudfoundry/python-buildpack/issues/34 ,但我仍然遇到 fatal error :

sql.h: No such file or directory.

我在下面创建了一个最小的、可验证的、完整的脚本,以方便读者重现我的问题:

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

这里有一个类似的问题:pyodbc install on IBM Bluemix server error ,但是这个问题与这个问题的不同之处在于它非常通用,而这个问题是关于同一主题但涉及一组非常具体的构建步骤。


更新:这是基于已接受答案的更新脚本:

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: fatal error: sql.h: No such file or directory #include

您的设置通常看起来不错,但是当 pip 在暂存期间运行时,构建工具仍然无法找到库 header 。 header 在那里,因为您将它们包含在 vendor/ 目录中,但它不知道它们在那里,因为 python 模块的构建脚本不会在该位置查找它们.

我不知道有什么方法可以让它在不修改构建包的情况下在非标准位置查找 header ,因为 you need to send additional argumentspip

一些人建议设置 CPATH 和/或 C_INCLUDE_PATH 环境变量,因为这些应该被 gcc 获取,但是在我的测试,这些都被忽略了。

最后,我认为最好的选择是使用 Conda 安装 pyodbc。以下是您的处理方式。

  1. environment.yml 添加到项目的根目录。
  2. 在其中添加以下内容:
name: pyodbc-test
dependencies:
- pyodbc
  1. 运行cf push

构建包应该在暂存期间运行,安装 miniconda,然后使用 conda 安装依赖项,特别是 pyodbc。

希望对您有所帮助!

关于cloud-foundry - "fatal error: sql.h"与 unixODBC 和 pyodbc 作为供应商应用程序依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44982510/

相关文章:

node.js - 如何在 SAP Cloud Platform 中使用 NodeJS 中的 Destination

java - 使用@ConfigurationProperties读取CF环境嵌套JSON

node.js - ASP.NET Core 2.0( Angular )到 CloudFoundry

ibm-cloud - Cloud Foundry - 如何访问 Node.js 应用程序中的环境变量?

python - 如何在 Bluemix 上运行后台进程?

cloud-foundry - 为什么删除相应的应用程序时,Pivotal Cloud Foundry 不会删除路由?

java - 如何在 Spring Cloud Dataflow "Cloudfoundry"服务器启动上引用本地 Kafka 和 Zookeeper 配置

java - 云类型转换 : update WAR without reverting server. xml

java - 在heroku 或cloudfoundry 上进行多 war 部署?

node.js - 我在 Bluemix 中启动 Node 应用程序时遇到问题