【问题标题】:Psycopg2 install with pip works but cannot import module on OS X 10.9使用 pip 安装 Psycopg2 可以工作,但无法在 OS X 10.9 上导入模块
【发布时间】:2014-02-24 00:06:54
【问题描述】:

我已经用

安装了 psycopg2
pip install psycopg2

它工作得很好。安装输出有几个警告,类似于

In file included from ./psycopg/psycopg.h:33:
./psycopg/config.h:71:13: warning: unused function 'Dprintf' [-Wunused-function]
static void Dprintf(const char *fmt, ...) {}
            ^
1 warning generated.

但最后它说

Successfully installed psycopg2

当我运行pip list时它也会出现。

现在当我尝试在 python 中导入它时出现错误:

$ python
Python 2.7.5 (default, Aug 25 2013, 00:04:04)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import psycopg2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named psycopg2

如果安装成功,Python为什么不能导入模块?

(Python 2.7.5 与 Homebrew 一起安装。psycopg2 与 pip 一起安装。)

【问题讨论】:

    标签: python osx-mavericks psycopg2


    【解决方案1】:

    OS X 已经自带 Python 2.7.5;当您使用 Homebrew 安装 Python 时,它会将较新的版本放在不同的位置,而不会触及内置版本。 Homebrew 的 Python 也带有 Pip,而 OS X 没有。这里发生的情况是,您使用 Homebrew 的 pip 安装 psycopg2,然后运行 ​​OS X 的 python 并尝试导入它。

    运行/usr/local/bin/python(Homebrew Python 的完整路径),然后从那里尝试import psycopg2

    如果可行,您需要将/usr/local/bin 放在/usr/bin 之前的PATH 变量中,以便您的shell 每次都能在OS X 之前找到Homebrew 的Python。如果您使用 Bash(OS X 中的默认 shell),您可以通过将以下内容放入您的 .bash_profile

    export PATH=/usr/local/bin:$PATH
    

    为确保您在脚本中运行正确的 Python,请使用以下 shebang 行:

    #!/usr/bin/env python
    

    env 将在PATH 中搜索 Python 并使用它找到的第一个脚本运行脚本,就像在 shell 中键入 python 一样。 Bash 脚本等应该继承PATH 变量并找到正确的python 而无需更改。

    您还可以在 shebang 行 (#!/usr/local/bin/python) 中硬编码 Homebrew Python 的路径,但这意味着您的脚本只能在安装了 Homebrew Python 的 OS X 机器上运行,最好避免使用。

    【讨论】:

    • 谢谢亚当。当我在终端中运行$ usr/local/bin/python 时,我实际上可以导入 psycopg2。 但是当我尝试对您建议的.bash_profile 进行更改时,没有任何更改生效。我使用了$ source .bash_profile,然后使用了$ python,但旧的python 仍然出现。如何使 brew 的 python 成为终端中的默认 python? (另外,当我运行 python 脚本文件时,比如从我编写的 shell 脚本中,我怎样才能确保它是用 brew 的 python 调用的?)
    • 我才意识到我写了set,而我本来打算写export;这应该会让 Bash 默认找到正确的。我已编辑我的答案以解决此问题并回答您的其他问题。
    猜你喜欢
    • 2012-03-29
    • 2014-04-29
    • 2013-11-02
    • 2014-04-29
    • 2011-12-28
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多