我正在尝试使用名为vcrpy的软件包来加速我的django应用程序测试套件的执行。我在Mac上使用django 1.7,使用Python 2.7。
我在我的一个测试中添加了以下几行:
import vcr
with vcr.use_cassette('recording.yaml'):
结果是导入错误:
import vcr
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/vcr/__init__.py", line 2, in <module>
from .config import VCR
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/vcr/config.py", line 6, in <module>
from .cassette import Cassette
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/vcr/cassette.py", line 12, in <module>
from .patch import CassettePatcherBuilder
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/vcr/patch.py", line 8, in <module>
from .stubs import VCRHTTPConnection, VCRHTTPSConnection
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/vcr/stubs/__init__.py", line 9, in <module>
from six.moves.http_client import (
ImportError: No module named http_client
VCR包本身有问题的代码是:
import six
from six.moves.http_client import (
HTTPConnection,
HTTPSConnection,
HTTPMessage,
HTTPResponse,
)
有趣的是:当我从普通的python控制台运行它时,这段代码似乎运行良好,但它导致Django下或django manage.py shell下的ImportError。
知道可能出错的是什么?
(关于六个模块位置的一些其他细节:
当我运行普通的python控制台时,我得到以下内容:
Python 2.7.8 (v2.7.8:ee879c0ffa11, Jun 29 2014, 21:07:35)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import six
>>> print six.__file__
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/six.pyc
使用import django; django.setup()
从manage.py shell
执行相同的操作会生成完全相同的目录和相同的six.pyc文件。
)
答案 0 :(得分:9)
对于原始问题可能有点太迟了,但我是通过Google来到这里以供将来参考,这是我的解决方案:
我发现的问题是mac os不仅包含python,还包含一些预装的包。六是其中一个包,其中就是冲突。预先安装的六个优先于安装的六个点,但是pip仍然根据它自己安装的内容提供信息(例如六个1.9.0对1.4.1)。
预装(版本1.4.1):
/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/
安装pip(无论你安装了什么,对我来说都是1.9.0):
/Library/Python/2.7/site-packages/
您可以通过运行以下方式检查是否属于这种情况:
$ python
>>> import six
>>> print six.__file__
'/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six.py'
解决方案实际上很简单,只需要
export PYTHONPATH="/Library/Python/2.7/site-packages:$PYTHONPATH"
在您的~/.bashrc
(或您的shell使用的任何文件)中。如果您已将pip配置为安装在其他位置,请将其放在python路径中。
答案 1 :(得分:1)
我在Fedora 21上遇到了类似的问题。原因是six 1.2.0 and 1.9.0
安装了2个版本。我通过卸载six
解决了这个问题,并重新安装了最新版本:
pip uninstall six
pip install six
答案 2 :(得分:0)
听起来像多版本冲突。我通过降级我的六版本来解决了类似的错误(1.9.0引起了错误,1.8.0和1.7.0也是如此)。 1.6.0无误地工作。
我得到的错误: 从six.moves导入http_client ImportError:没有名为move
的模块