在OSX 10.9(Mavericks)上安装pyodbc失败

时间:2013-11-19 14:48:46

标签: python macos pyodbc

运行pip install pyodbc时,我会

In file included from .../build/pyodbc/src/buffer.cpp:12:
    .../build/pyodbc/src/pyodbc.h:52:10: fatal error: 'sql.h' file not found
    #include <sql.h>
             ^
    1 error generated.
    error: command 'cc' failed with exit status 1

似乎小牛队在/ usr / include

下没有sql.h

有没有人设法安装pyodbc?有没有已知的解决方法?

12 个答案:

答案 0 :(得分:57)

您可以使用Homebrew以通常的方式通过pip安装unixodbc,然后使用pyodbc。

brew install unixodbc && pip install pyodbc

这适用于小牛队。

答案 1 :(得分:33)

正如您注意到OSX Mavericks删除了PyODBC编译所需的sql头。 按照这些步骤允许我安装PyODBC:

  1. 确保已安装iODBC库(http://www.iodbc.org/
  2. 下载并提取iODBC来源
  3. 运行pip install --no-install pyodbc
  4. cd [VIRTUAL_ENV]/build/pyodbc
  5. 运行python setup.py build_ext --include-dirs=[LIBIODBC_SOURCES]/include/
  6. 运行pip install --no-download pyodbc

    Installing collected packages: pyodbc
      Running setup.py install for pyodbc
    
        warning: no files found matching 'tests/*'
    Successfully installed pyodbc
    Cleaning up...
    
  7. 我也可以将[libiodbc_sources]/include/下的文件复制到/usr/include并运行pip install pyodbc,但我不想手动将文件添加到系统文件夹中。

答案 2 :(得分:30)

经过多次死胡同,这对我有用:

$ brew unlink unixodbc
$ brew install unixodbc  --universal
$ sudo pip install --upgrade --global-option=build_ext --global-option="-I/usr/local/include" --global-option="-L/usr/local/lib" --allow-external pyodbc --allow-unverified pyodbc pyodbc

答案 3 :(得分:14)

在我们提供其他答案的徒劳尝试之后,请参阅我写的installation instructions

首先,安装以下库:

$ brew install unixodbc
$ brew install freetds --with-unixodbc

FreeTDS现在应该可以正常工作,无需配置:

$ tsql -S [IP or hostname] -U [username] -P [password]
locale is "en_US.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
1> ^D

在unixODBC上,我们需要链接到驱动程序,编辑/usr/local/etc/odbcinst.ini

[FreeTDS]
Description = TD Driver (MSSQL)
Driver = /usr/local/lib/libtdsodbc.so
Setup = /usr/local/lib/libtdsodbc.so
FileUsage = 1

我们使用的测试命令需要配置DSN,因此请修改/usr/local/etc/odbc.ini

[MYDSN]
Driver = FreeTDS
Server = [IP address]
Port = 1433

DNS的配置可能有所不同,您可能需要TDS_VersionServername指令。以上为SQL Server 2008 R2工作。现在,运行测试命令:

$ isql MYDSN [username] [password] -v
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> ^D

如果测试成功,您可以继续安装Python库pyodbc。当前版本的写入(3.0.7)不与OS X上的unixODBC链接,因此必须对setup.py进行更改。下载源包并将其解压缩到某处。找到以下行(146-147):

    elif sys.platform == 'darwin':
        # OS/X now ships with iODBC.

并更改此行:

        settings['libraries'].append('iodbc')

成:

        settings['libraries'].append('odbc')

然后运行以下命令进行安装:

> python install .

现在pyodbc应该可以工作:

import pyodbc
pyodbc.connect('DSN=MYDSN;UID=[username];PWD=[password]')

您无需在odbc.ini中配置DSN,因此请清除该文件。您可能希望在连接上选择数据库,因此请将连接线更改为:

pyodbc.connect('DRIVER=FreeTDS;SERVER=[IP address];PORT=1433;DATABASE=[database];UID=[username];PWD=[password]')

请注意,您也可以链接到FreeTDS的库文件,而不是使用odbcinst.ini,如下所示:

pyodbc.connect('DRIVER=/usr/local/lib/libtdsodbc.so;SERVER=[IP address];PORT=1433;DATABASE=[database];UID=[username];PWD=[password]')

答案 4 :(得分:10)

我对@ Vitaly的回答并不满意,因为在Mavericks上构建软件包似乎存在一个问题,即缺乏对硬链接的支持。我无法获得构建的包。

所以我选择了@Vitaly的第二个建议,即将必要的文件从[libiodbc_sources]/include/目录复制到/usr/include,安装工作查找。以下是您需要复制的文件列表:

  • sql.h
  • sqltypes.h
  • iodbcunix.h
  • sqlext.h
  • sqlucode.h

答案 5 :(得分:9)

在尝试了其他一切建议后,这对我有用。

brew install unixodbc
sudo pip install --upgrade --global-option=build_ext --global-option="-I/usr/local/include" --global-option="-L/usr/local/lib" --allow-external pyodbc --allow-unverified pyodbc pyodbc

运行Mac OS 10.11.1,Homebrew 0.9.5和pip 7.1.2

答案 6 :(得分:2)

如果您看到

等错误
clang: error: unknown argument: '-mno-fused-madd' [-Wunused-command-line-argument-hard-error-in-future]

问题在于,Mavericks已经从命令行开发者工具中删除了 gcc ;它现在 clang 只是符号链接 gcc 。 clang不支持--mno-fused-madd标志(许多其他标志也是如此)。

一种解决方案可能是使用自制软件或其他方法安装gcc,并将symlink / usr / bin / gcc安装到正确的gcc。

对我有用的更简单的解决方法是通过将这些错误变为警告来抑制这些错误:

export CFLAGS=-Qunused-arguments

设置后我能够pip install pyodbc没有错误。

PS!在未来的clang版本中,这可能是不可能的。至少它适用于:

$> gcc -v
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.1 (clang-503.0.38) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.1.0
Thread model: posix

参考文献:
https://bitbucket.org/cffi/cffi/issue/46/unused-mno-fused-madd-clang-warnings-on-os https://coderwall.com/p/lqpp8w clang: error: unsupported option '-static-libgcc' on Mac OSX Mavericks

答案 7 :(得分:1)

我刚刚在Mac OS X上完成了整个过程;连接到pyodbc到MS SQL Server 2014.整个过程如下:

连接管道:

pyodbc ----> iodbc ----> freetds ----> MS SQL Server 2014
  1. 构建freetds(SQL Server驱动程序/连接器):

    ./configure --prefix=/usr/local --with-tdsver=8.0
    
    make
    
    sudo make install
    
    // you should see /usr/local/lib/libtdsodbc.so was generated
    
    //test method 1:
    
    TDSVER=8.0 tsql -H hostname -p 1433 -U username -P XXX -D databasename
    
    //test method 2:
    
    //config /usr/local/etc/freetds.conf
    [mssqlserver]
        host = XXX
        port = 1433
        tds version = 8.0
    
    //run
    
    tsql -S mssqlserver -U username -P XXX -D databasename  
    
    //if you can run sql, good to go!
    
  2. 构建iodbc(ODBC管理器):

    //download from github, go to the folder
    
    cd mac
    
    ./configure 
    
    ./make
    
    sudo ./make install
    
    //config /usr/local/etc/odbc.ini
    [mssqlserver]
    Driver=/usr/local/lib/libtdsodbc.so
    TDS_Version=8.0
    Server=xxxx
    Port = 1433
    Trace = Yes
    Description=XXX
    
    //test
    
    which iodbctest
    
    iodbctest 
    
    DSN=masqlserver;UID=xxx;PWD=xxx
    
    //if you can run sql, good to go!
    
  3. 将pyodbc(Python ODBC包装器)连接到iodbc:

    pip install pyodbc 
    
    //in python,
    
    conn = pyodbc.connect("DSN=mssqlserver;UID=xxx;PWD=xxxx") 
    

答案 8 :(得分:1)

我成功了 sudo port install py-pyodbc

答案 9 :(得分:0)

我要加0.02美元。维塔利的答案是主要的灵感。

OSX 10.9.5,MacPorts 2.3.4,pip 8.1.2(没有--no-install选项),virtualenv 14.0.6

也有帮助:https://stackoverflow.com/a/22942120/1394353

无论如何,通过 MacPorts

安装iODBC

sudo port install libiodbc

缺少的sql.h由MacPorts @ / opt / local / include

存放

现在,告诉pip它可以在哪里找到包含(链接的答案派上用场的地方):

pip install pyodbc --global-option=build_ext --global-option="-I/opt/local/include/"

答案 10 :(得分:0)

由于pip不再支持--no-install选项,因此不推荐使用--download选项。我必须遵循以下步骤。

pip download pyodbc
tar -zxvf pyodbc-4.0.17.tar.gz
python setup.py build_ext --include-dirs=[DIRECTORY CONTAINING THE HEADERS]
pip install pyodbc

答案 11 :(得分:-1)

我今天在ubuntu 14.04上遇到了同样的问题。我在下面的链接中找到一些人说应该安装unixodbc-dev。

https://code.google.com/p/pyodbc/issues/detail?id=55

我做到了,然后pip安装成功。

希望这有用。