获取错误:DLL加载失败:操作系统无法运行%1 - Python 2.7; Scrapy模块;导入密码学

时间:2014-04-02 03:06:15

标签: python-2.7 dll module scrapy

我无法在Scrapy教程(http://doc.scrapy.org/en/latest/intro/tutorial.html)中成功运行第一个命令。粘贴在下面的代码副本是结果(最后有错误)。

安装了

Python 2.7 ,并按照scrapy (http://doc.scrapy.org/en/latest/intro/install.html)的安装说明进行操作。我在Windows 7(64位)上运行 Python 2.7.6 32位

安装的其他方面:

  1. Twisted-13.2.0.dist-info
  2. zope.interface-4.1.1-py2.7
  3. Scrapy-0.22.2-py2.7
  4. lxml-3.3.3-py2.7
  5. cssselect-0.9.1-py2.7
  6. cryptography-0.3.dist-info
  7. pyOpenSSL-0.14-py2.7
  8. pywin32_system32
  9. 这是错误信息:

    C:\Python27\Scripts>scrapy startproject tutorial
        Traceback (most recent call last):
          File "C:\Python27\lib\runpy.py", line 162, in _run_module_as_main
            "__main__", fname, loader, pkg_name)
          File "C:\Python27\lib\runpy.py", line 72, in _run_code
            exec code in run_globals
          File "C:\Python27\lib\site-packages\scrapy\cmdline.py", line 9, in <module>
            from scrapy.crawler import CrawlerProcess
          File "C:\Python27\lib\site-packages\scrapy\crawler.py", line 3, in <module>
            from twisted.internet import reactor, defer
          File "twisted\internet\reactor.py", line 38, in <module>
            from twisted.internet import default
          File "twisted\internet\default.py", line 56, in <module>
            install = _getInstallFunction(platform)
          File "twisted\internet\default.py", line 50, in _getInstallFunction
            from twisted.internet.selectreactor import install
          File "twisted\internet\selectreactor.py", line 18, in <module>
            from twisted.internet import posixbase
          File "twisted\internet\posixbase.py", line 24, in <module>
            from twisted.internet import error, udp, tcp
          File "twisted\internet\tcp.py", line 29, in <module>
            from twisted.internet._newtls import (
          File "twisted\internet\_newtls.py", line 21, in <module>
            from twisted.protocols.tls import TLSMemoryBIOFactory, TLSMemoryBIOProtocol
          File "twisted\protocols\tls.py", line 40, in <module>
            from OpenSSL.SSL import Error, ZeroReturnError, WantReadError
          File "build\bdist.win32\egg\OpenSSL\__init__.py", line 8, in <module>
          File "build\bdist.win32\egg\OpenSSL\rand.py", line 11, in <module>
          File "build\bdist.win32\egg\OpenSSL\_util.py", line 4, in <module>
          File "C:\Python27\lib\site-packages\cryptography\hazmat\bindings\openssl\binding.py",      l3, in __init__
          self._ensure_ffi_initialized()
          File "C:\Python27\lib\site-packages\cryptography\hazmat\bindings\openssl\binding.py", l9, in _ensure_ffi_initialized libraries)
          File "C:\Python27\lib\site-packages\cryptography\hazmat\bindings\utils.py", line 77, ind_ffi
            ext_package="cryptography",
          File "C:\Python27\lib\site-packages\cffi\api.py", line 341, in verify
            lib = self.verifier.load_library()
          File "C:\Python27\lib\site-packages\cffi\verifier.py", line 75, in load_library
            return self._load_library()
          File "C:\Python27\lib\site-packages\cffi\verifier.py", line 151, in _load_library
            return self._vengine.load_library()
          File "C:\Python27\lib\site-packages\cffi\vengine_cpy.py", line 138, in load_library
            raise ffiplatform.VerificationError(error)
    
    cffi.ffiplatform.VerificationError: importing 'C:\\Python27\\lib\\site-packages\\cryptogr
    \_Cryptography_cffi_48bbf0ebx93c91939.pyd': DLL load failed: The operating system cannot
    1.**
    

9 个答案:

答案 0 :(得分:6)

我有这个问题是由于另一个(较旧的?)版本的libeay32.dll和ssleay32.dll在我自己的OpenSSL 1.0.1g安装之前在PATH上。我建议您使用SysInternals中的Process Monitor来监视python.exe,以查看它实际加载OpenSSL DLL的位置。

在我的情况下,罪犯是C:\Program Files (x86)\Intel\iCLS Client\的一些英特尔组件与我的驱动程序一起提供。在PATH环境变量中移动我自己的OpenSSL bin目录后,一切都按预期工作。

答案 1 :(得分:5)

我只是重新安装加密以使其工作。

pip卸载密码学

pip安装密码学

答案 2 :(得分:4)

这是由于_Cryptography_cffi_48bbf0ebx93c91939.pyd取决于openssl dll ssleay32.dll和libeay32.dll。在windows上编译openssl之后,你可以将这两个文件复制到system32。

答案 3 :(得分:4)

@ crazyzh1984的方法有点复杂,但是他在答案底部发布的补充非常有用。我下载了&#34; Win32 OpenSSL v1.0.1g Light&#34;在http://slproweb.com/products/Win32OpenSSL.html然后我可以成功安装pyOpenSSL。

答案 4 :(得分:2)

@lambokini是对的,但是我对答案给出了评论,所以来吧。

首先从http://www.openssl.org/

下载openssl源代码

第二次启动“Visual Studio命令提示符”,编译并安装openssl按照安装指南(INSTALL.W32或INSTALL.W64)。

然后将“[openssl install path] \ bin”添加到环境变量“path”, 你可以在system32下删除ssleay32.dll和libeay32.dll。

注意:dll将从它所连接的第一个位置加载。 例如:Path = xxx; d:\ PHP5; d:\ openssl \ bin; 如果ssleay32.dll和libeay32.dll也出现在PHP5下, 然后python将加载那个。

答案 5 :(得分:2)

由于我的极度沮丧,我会写下自己对此的看法,并希望这可能会帮助其他一些可怜的家伙解决他在窗户上工作的问题。

有一个类似问题的有问题的libeay32.dll和ssleay32.dll,或者看起来似乎如此,但是用Process Monitor确认了它。

在System32中找到这些dll后,一切都进入了地狱: enter image description here

所以我没有遭遇错误C:\Program Files (x86)\Intel\iCLS Client\ s(但我确实改变了他们的顺序,因此system32在{{1}}之前出现。

接下来我使用this site这里指出的其他人。我使用过Win32 OpenSSL v1.0.2j Light,因为较新的(1.1.0b)因为某些原因没有为我生成这些dll。

在不同的bin文件夹中生成它们,以便您看到它们是新的,然后将它们复制到system32。瞧,scrapy命令行工作。

此外,截至今天,anaconda的scrapy 1.1.2没有创建运行scrapy命令的密钥文件,我打开并关闭了有关此问题的问题here

答案 6 :(得分:2)

如上所述,有两个.dll文件被加载而不是使用Scrapy下载的openssl。这两个.dll文件不兼容。

我通过将下载的.dll文件(我使用Anaconda安装scrapy)作为环境变量中的更高优先级来解决这个问题,如附图所示。

Environment Variables - PATH

在环境变量中,在系统变量和&#34;路径&#34;我把Anaconda3的位置如上图所示放在顶部,因此当python加载openssl时它是优先考虑的

答案 7 :(得分:1)

正如其他答案中已经提到的,问题是由两个文件ssleay32.dlllibeay32.dll引起的。 在Python中导入OpenSSL时发生错误

>>> from OpenSSL import crypto, SSL
  Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "c:\Python27\lib\site-packages\OpenSSL\__init__.py", line 8, in <module>
    from OpenSSL import crypto, SSL
ImportError: DLL load failed: The operating system cannot run %1.

以下是我在Windows 10上解决问题的方法。如果您有适用于Windows的git(下载here),您只需将这两个文件从Git\mingw64\bin\复制到路径中的某个位置即可。对我有用的是将它们复制到c:\Windows(或者从你开始使用Python的文件夹)。

要在cmd提示符下找到dll文件类型的位置:

>where libeay32.dll
C:\Program Files (x86)\Intel\TXE Components\TCS\libeay32.dll
...
C:\Users\me\AppData\Local\Programs\Git\mingw64\bin\libeay32.dll

答案 8 :(得分:0)

我今天在Windows 7系统上遇到了这个错误。对我来说问题类似于@ user2314737,@ goetsjoeba和@Olegp。 libeay32.dll和ssleay32.dll在与Windows path环境变量中的英特尔相关的文件夹中。

不幸的是,我的系统被锁定(工作计算机),所以我无法移动文件或改变系统的路径变量。相反,我手动从Python访问的路径变量中删除了与Intel相关的项目:

import os
os.environ['path'] = ';'.join(
    filter(lambda x: 'intel' not in x.lower(), os.environ['path'].split(';'))
    )
import OpenSSL