1

我在 Sublime Text 3 中安装了 SublimeREPL,它运行良好。但是,每当我尝试导入使用_socketurllib2 和 urllib 之类的模块时,它都会给我一个 ImportError。我运行 os.path 来验证路径是否正确。它在 python 命令行中也可以正常工作,只是在 SublimeREPL 中不行。

>>> import urllib2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "E:\Python27\lib\urllib2.py", line 94, in <module>
    import httplib
  File "E:\Python27\lib\httplib.py", line 71, in <module>
    import socket
  File "E:\Python27\lib\socket.py", line 47, in <module>
    import _socket
ImportError: DLL load failed: %1 is not a valid Win32 application.
4

2 回答 2

2

您几乎可以肯定混合了 Python 安装。也就是说,您已经使用 64 位 Python 获得了 SublimeREPL,但您在同一台机器上也有 32 位 Python,并且您PYTHONPATH的配置为指向 32 位 Python 的库而不是/在其之前自己的。

或者,更糟糕的是,您将两个 Python 都安装到了同一个目录,并且您有一个单独的安装,一部分是 64 位,一部分是 32 位。(如果是这种情况,您将在命令行中使用 Python 得到相同的错误。)

混合使用原生和 Cygwin Python、CPython 和 IronPython,或者有时甚至使用不同标志编译的两个构建,或者两个不同的 XY 版本,也会导致这种情况,但 32 位和 64 位是最常见的原因。

本身加载的原因urllib2是 Python 2.7 源代码是 Python 2.7 源代码;它来自什么版本并不重要。但是编译成 DLL 的 C 扩展是针对特定的 Python 解释器编译的,并且只能在该解释器上工作。如果 Windows DLL 加载器没有拒绝让 Python 继续前进,那么稍后您将得到一个不同的错误。

虽然我们正在这样做,但 Python 在 3.3 左右改进了这种情况下的错误处理,使其更容易判断发生了什么,但当然,如果你坚持使用 2.7,你就不会获得新功能。


在 Python 内部,判断您是在 32 位还是 64 位解释器中的最快方法是sys.getmaxsize. 如果是 2 或 40 亿,你是 32 位的;如果它大约是 9 或 18 位太多数字而无法计数,那么您就是 64 位。

在 Windows 上找出 DLL 是 32 位还是 64 位显然比在宇宙中的任何其他平台上都要困难得多。有关详细信息,请参阅此问题问题。

于 2014-08-03T07:33:58.310 回答
0

我遇到了同样的问题。我怀疑这与使用 SublimeText 3 64 位和使用 32 位 Python 3 进行 SublimeREPL 有关。

我卸载了 Python 3 32 位,并安装了 64 位 Python 3,但这提出了一个关于版本不匹配的新错误。我已经安装了 Python 3.4,并且我当前版本的 SublimeText 捆绑了 Python 3.3。

所以,我安装了 Python 3.3 64bit 以匹配 SublimeText 3(Build 3083)的捆绑 python,它终于工作了。这是来自 Sublime Text 的 REPL 选项卡中的:

Python 3.3.5 (v3.3.5:62cf4e77f785, Mar  9 2014, 10:35:05) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import urllib.request
>>> 
于 2015-04-08T08:32:28.580 回答