【问题标题】:VirtualEnv - Python 3.2 - Package gives ImportError (but not in 2.7)VirtualEnv - Python 3.2 - 包给出 ImportError(但不在 2.7 中)
【发布时间】:2013-03-22 15:58:11
【问题描述】:

我是 virtualenv 的新手,但我遇到的错误对我来说没有任何意义。

当我在 Python 2.7 virtualenv 中执行 pip install MultiString 时,我可以毫无问题地使用该包。

如果我在 Python 3.2 中执行相同操作,安装会按预期运行,但是在尝试导入时,我得到:

  File "<stdin>", line 1, in <module>
  File "/home/tom/p3/lib/python3.2/site-packages/multistring/__init__.py", line 1, in <module>
    from MultiString import MultiString
ImportError: No module named MultiString

即使:

(p3)tom@K9:~$ ls -alh /home/tom/p3/lib/python3.2/site-packages/multistring/
total 28K
drwxrwxr-x 3 tom tom 4.0K Mar 22 11:44 .
drwxrwxr-x 7 tom tom 4.0K Mar 22 11:43 ..
-rw-rw-r-- 1 tom tom   36 Mar 22 11:43 __init__.py
-rw-rw-r-- 1 tom tom  12K Mar 22 11:43 MultiString.py
drwxrwxr-x 2 tom tom 4.0K Mar 22 11:43 __pycache__

如果我 cd 进入该目录并在 p3 virtualenv 中执行 python __init__.py,则没有问题。同样,如果我 cd 进入该目录并打开一个交互式会话,我就可以像往常一样导入和使用该库。

给出的错误消息表明它正在找到正确的包,但我不明白为什么它无法导入它。

我尝试将/home/tom/p3/lib/python3.2/site-packages 添加到PATH 环境变量中,以防万一,但这并没有解决问题。

我正在尝试使用 tox 来测试我的库与 Python 3 的兼容性,而我使用 Python 3 的次数不多,但我觉得这更多是 virtualenv 的问题。

【问题讨论】:

  • 猜测,这是旧 (2.x) 相对导入的问题。 __init__.py 可能有from MultiString import MultiString,而它应该有from multistring.MultiString import MultiString,或者(我认为)from .MultiString import MultiString。这是我在 3.x 下安装 2.x 包时多次偶然发现的问题。

标签: python virtualenv python-3.2


【解决方案1】:

猜测,这是旧 (2.x) 相对导入的问题。 __init__.py 可能有

from MultiString import MultiString

应该是这样的

from multistring.MultiString import MultiString

或者(我认为)

from .MultiString import MultiString

但我相信绝对导入是首选。

这是我在 3.x 下安装 2.x 软件包时多次偶然发现的问题。我不知道 2to3 工具是否解决了这个问题(我已经手动破解了源代码)。

【讨论】:

    猜你喜欢
    • 2014-02-28
    • 2012-01-13
    • 1970-01-01
    • 2016-06-17
    • 2016-03-18
    • 2016-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多