3

我在 virtualenv 中使用 python。我有以下模块:

offers/couchdb.py

from couchdb.client import Server

def get_attributes():
    return [i for i in Server()['offers']]

if __name__ == "__main__":
    print get_attributes()

当我从文件运行它时,我得到:

$ python offers/couchdb.py
Traceback (most recent call last):
  File "offers/couchdb.py", line 1, in <module>
    from couchdb.client import Server
  File "/Users/bartekkrupa/D/projects/commercial/echatka/backend/echatka/offers/couchdb.py", line 1,     in <module>
    from couchdb.client import Server
ImportError: No module named client

但是当我将它粘贴到解释器中时......它可以工作:

$ python
Python 2.7.2 (default, Jun 20 2012, 16:23:33) 
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from couchdb.client import Server
>>> 
>>> def get_attributes():
...     return [i for i in Server()['offers']]
... 
>>> if __name__ == "__main__":
...     print get_attributes()
... 

从文件运行该模块的python 没有加载 couchdb 模块,但在 REPL 中运行可能是什么原因?

4

2 回答 2

7

您偶然发现了一个错误特征:相对导入。当您说 时from couchdb.client...,Python 首先offers.会在名为couchdb. 它会找到一个:你正在处理的文件,offers/couchdb.py

通常的解决方法是禁用这种行为,无论如何,这在 Python 3 中已经消失了。把它作为 Python 代码的第一行放在你的文件中:

from __future__ import absolute_import

然后 Python 将假定您要从名为(您这样做)的顶级模块导入couchdb,而不是当前模块的兄弟。

不幸的是,在这种情况下,您直接运行该文件,Python 仍将添加offers/到其搜索路径中。运行打算作为模块的文件时,您可以使用以下命令运行它-m

python -m offers.couchdb

现在它应该可以工作了。

(当然,你可以不命名你的文件couchdb.py。但我发现以它们与之交互或包装的东西命名的模块非常有用。)

于 2013-01-16T20:19:31.090 回答
0

编辑: 见上面 Eevee 的回答——我认为它更合适。不过,这可能对其他人有帮助(?):

也许你没有在你的 virtualenv 中安装 couchdb?这可以解释为什么它在解释器中工作(如果解释器不是从 virtualenv.xml 启动的)。

要么在那里安装它,要么使用--site-packages 创建virutalenv。

于 2013-01-16T20:20:19.030 回答