我在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中运行会有什么作用?
答案 0 :(得分: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
。但我发现让模块以他们交互或包装的东西命名是非常有用的。)
答案 1 :(得分:0)
修改强> 请参阅上面的Eevee答案 - 我认为它更合适。 不过,这可能对其他人有用(?):
也许你没有在virtualenv中安装couchdb? 这可以解释为什么它在解释器中工作(如果解释器不是从virtualenv启动。
将其安装在那里或使用--site-packages创建virutalenv。