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

39

运行 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

看起来Mavericks在/usr/include目录下没有sql.h文件

有人成功安装了pyodbc吗?是否有已知的解决方法?


作为相关信息的一部分 - 除非在那时和现在之间有所改变,否则pypyodbc可能会在64位系统上读取不完整的列标题。我已经在这里修复了这个问题:(https://github.com/waynew/pypyodbc) - Wayne Werner
在以下帖子中回答了M1用户的问题: https://dev59.com/UcPra4cB1Zd3GeqPlauP#72693640 - Dugini Vijay
13个回答

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

在Mavericks上对我有效。


3
一开始我点了赞,因为它似乎能够运行。然而虽然安装成功了,但我无法连接上它。 - Bouke
1
pip 无法为 pyodbc 正常工作,但在安装了 unixodbc 后,从源代码构建可以正常工作。 - Castrona
1
这对我来说是可行的:sudp pip install pyodbc --allow-external pyodbc --allow-unverified pyodbc。 - tol4trob
它将安装,但是当以编程方式运行查询时,您可能会注意到此类问题:ProgrammingError:('42622','[42622] ERROR 3507:标识符"\ xf2 \ xa0 \ x80 \ x8d \ xef \ xbf \ xbd \ xef \ xbf \ xbd \ xef \ xbf \ xbd \ xf2 \ xa0 \ x81 \ x94 \ ...。Vitaly的答案正确地将包含目录绑定到pyodbc的构建步骤中。 - Jared Scott
这对我起作用了,但我还必须使用 brew install freetds --with-unixodbc 安装 FreeTDS。这是在 Mavericks、Python 2.7.10、pyodbc 3.0.10 下的情况。 - aldel
显示剩余3条评论

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...
    

我可以将[libiodbc_sources]/include/下的文件复制到我的/usr/include目录下,然后运行pip install pyodbc,但我不想手动将文件添加到系统文件夹中。


2
这个过程有良好的文档说明。由于某种原因,我最终需要使用“-I”标志来包含文件,而不是“--include-dirs”。但它成功了! - Thomas Farvour
1
嘿,对于一个新手来说,Mac环境中的文件夹[libiodbc_sources]和[VIRTUAL_ENV]是什么意思?我尝试搜索它们,但找不到... 感谢任何帮助! - Sim
1
[LIBIODBC_SOURCES] 是你提取 iODBC 的地方 [VIRTUAL_ENV] 是 Python 虚拟环境路径(对于 Mac 平台没有特殊要求),如果你不使用 virtualenv,你将在你所使用的 Python 安装中找到相关目录。 - m_vitaly
6
使用最新版本的pip,第三步变成了pip install --allow-external pyodbc --allow-unverified pyodbc pyodbc==3.0.7。请注意,--no-install已被弃用。 - Jared Scott
6
使用最新版本的 pip,选项 --no-download--no-install 已经被移除了。您可以使用命令 pip install --download . pyodbc --no-binary pyodbc 在临时目录中下载所需的文件,然后解压缩并切换到解压后的目录。接下来,在 setup.py 文件中修改正确的 ODBC 链接库引用(在我的情况下是 'iodbc'),然后进行第 5 步操作。最后,用命令 pip install . 替代第 6 步操作(必要时加上 --upgrade)。 - B98
显示剩余4条评论

31

在尝试了多次失败后,这个方法最终奏效:

$ 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

这篇博客文章对于在OSX 10.9上更新pyodbc-3.0.9非常有帮助:http://stefanoapostolico.com/2015/04/20/django_mssql_osx.html - dennisobrien
谢谢!Macports也可以通过将“usr”替换为“opt”来使用。 - TurtleIzzy
这对我有效,而被接受的答案则不行!看起来更加更新。 - alitheg
1
对于第二个命令,我得到了这个错误:错误:无效选项:--universal - yardstick17
选项“-allow-external”和“--allow-unverified”已经被删除。这个答案不再有效。 - Jari Turkia

14

请看我在其他答案无效的尝试后,写的安装指南

首先,安装以下库:

$ 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]')

点赞你的回答,因为展示了FreeTDS安装步骤,而其他大多数回答都忽略了这一点。虽然我不需要编辑你提到的任何文件,只需安装unixodbc、freetds和pyodbc即可。这可能是由于pyodbc更近期版本的改进(当前版本为3.0.10)。 - aldel
我收到了“错误:无效选项:--with-unixodbc”的提示。有什么建议吗? - Jari Turkia

10

在尝试了几乎所有其他建议之后,这对我起了作用。

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。


允许未经验证引发了“没有这样的选项”错误。有什么建议吗? - Praxiteles
@Praxiteles 你是直接复制粘贴的吗? - Lothilius
适用于Homebrew 1.3.4,pip 9.0.1,MacOS 10.12。 - Istvan
更简单的方法是,这对我有效:brew install unixodbc; pip install pyodbc - DS.
它对我起作用了: brew install unixodbc; pip3 install --upgrade --global-option=build_ext --global-option="-I/usr/local/include" --global-option="-L/usr/local/lib" pyodbc - Timur Nurlygayanov

10

我对 @Vitaly 的回答并不满意,因为在Mavericks上构建包存在一个问题,这与hard-linking的支持不足有关。 我无法编译该包。

因此,我选择了 @Vitaly 的第二个建议,将必要的文件从 [libiodbc_sources]/include/ 目录复制到 /usr/include 中,安装成功了。以下是需要复制的文件列表:

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

/usr/include在哪里?[libiodbc_sources]在哪里?当我们解压缩libiodbc时,它没有指示安装在哪里。 - Praxiteles
@Praxiteles 希望你现在已经找到了答案,但如果没有,对于 iODBC 的版本 3.52,你可以在 /Library/Frameworks/iODBC.framework/Versions/3.52/Headers 找到 [libiodbc_sources]。 - alexhb

2
如果你看到像这样的错误


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

问题在于,Mavericks系统中已经将命令行开发工具中的gcc移除了,现在使用的是通过符号链接方式连接到gccclang。然而,--mno-fused-madd标志不被clang支持(同样适用于许多其他标志)。
其中一个解决方法可能是使用homebrew或其他方法安装gcc,并将/usr/bin/gcc符号链接到正确的gcc。
对我而言,更简单的解决方法是将这些错误抑制并转换为警告。
export CFLAGS=-Qunused-arguments

在进行了一些设置后,我成功地安装了pyodbc

注意:在未来的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
这些参考文献与IT技术有关。

1
我可以翻译这段内容。这是关于在Mac OS X上连接到MS SQL Server 2014的pyodbc过程的介绍。整个过程如下所示:
连接流程:
pyodbc ----> iodbc ----> freetds ----> MS SQL Server 2014
  1. Build freetds (the SQL Server driver/connector):

    ./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. Build iodbc (ODBC manager):

    //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. Connect pyodbc (Python ODBC wrapper) to iodbc:

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

如果使用Python,请考虑使用virtualenv。玩弄系统安装的Python可能会在操作系统级别上创建问题。https://virtualenv.pypa.io/en/latest/ - FlipperPA

1

我使用sudo port install py-pyodbc成功了。


0

我来发表一下我的看法。Vitaly的回答是主要的灵感来源。

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

还有帮助:https://dev59.com/M2Mk5IYBdhLWcg3w_yzo#22942120

无论如何,通过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/"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接