【问题标题】:Exe built with cx_Freeze shows error when containing pysftp import使用 cx_Freeze 构建的 Exe 在包含 pysftp 导入时显示错误
【发布时间】:2019-07-25 22:11:33
【问题描述】:

我正在尝试从使用 pysftp 的 python 脚本编译可执行文件。我正在使用 cx_Freeze 来做到这一点。

这是我的代码:

Test.py

import datetime
import time
import os
import pysftp

i = 0
while(i<10):
    tm = datetime.datetime.now()
    print (tm.strftime('%H:%M:%S'))
    time.sleep(1)
    i += 1

设置如下:

setup.py

from cx_Freeze import setup, Executable

base = None    

executables = [Executable("Test.py", base=base)]

packages = ["idna", "datetime", "time", "os", "pysftp"]
options = {
    'build_exe': {    
        'packages':packages,
    },    
}

setup(
    name = "<any name>",
    options = options,
    version = "<any number>",
    description = '<any description>',
    executables = executables
)

当我从命令行运行test.py 时,它工作正常。但是当我运行运行命令python setup.py build 后构建的exe 时,test.exe 失败并显示如下:

C:\Users\cb\Desktop\Python Scripts\Test cx_Freeze install\build\exe.win-amd64-3.7>Test.exe
Traceback (most recent call last):
  File "C:\Users\cb\AppData\Local\Programs\Python\Python37\lib\site-packages\cx_Freeze\initscripts\__startup__.py", line 14, in run
    module.run()
  File "C:\Users\cb\AppData\Local\Programs\Python\Python37\lib\site-packages\cx_Freeze\initscripts\Console.py", line 23, in run
    exec(code, {'__name__': '__main__'})
  File "Test.py", line 4, in <module>
  File "C:\Users\cb\AppData\Local\Programs\Python\Python37\lib\site-packages\pysftp\__init__.py", line 12, in <module>
    import paramiko
  File "C:\Users\cb\AppData\Local\Programs\Python\Python37\lib\site-packages\paramiko\__init__.py", line 22, in <module>
    from paramiko.transport import SecurityOptions, Transport
  File "C:\Users\cb\AppData\Local\Programs\Python\Python37\lib\site-packages\paramiko\transport.py", line 90, in <module>
    from paramiko.ed25519key import Ed25519Key
  File "C:\Users\cb\AppData\Local\Programs\Python\Python37\lib\site-packages\paramiko\ed25519key.py", line 17, in <module>
    import bcrypt
  File "C:\Users\cb\AppData\Local\Programs\Python\Python37\lib\site-packages\bcrypt\__init__.py", line 25, in <module>
    from . import _bcrypt
ModuleNotFoundError: No module named '_cffi_backend'

关于我应该尝试什么的任何建议?

我已经尝试将"cryptography""paramiko" 添加到包列表中。我在网上查看过,发现我可能必须明确说明我用于 cx_Freeze 的库,但我不确定那是什么。

我正在使用 python 3.7.3-64bit 和 windows 10。

【问题讨论】:

    标签: python-3.x cx-freeze pysftp


    【解决方案1】:
    1. 尝试将"paramiko""bcrypt" 添加到setup.py 脚本中的packages 列表中。如果这仍然不起作用,请发布您应该获得的新回溯。

      编辑:根据 OP,这并不能解决问题。

    2. 在你的C:\Users\cb\AppData\Local\Programs\Python\Python37\lib\site-packages 中搜索一个名为_cffi_backend*.* 的文件,你找到什么了吗?

      编辑:根据OP's answer,有文件[Python version]\Lib\site-packages\_cffi_backend.cp37-win_amd64.pyd,手动将此文件复制到生成的可执行文件旁边的lib 目录即可解决问题。

      您应该能够让 cx_Freeze 自动执行此附加步骤,方法是像这样修改您的 setup.py 脚本:

      import _cffi_backend
      _cffi_backend_file = _cffi_backend.__file__
      include_files = [(_cffi_backend_file, 'lib')]
      options = {
          'build_exe': {
             'include_files': include_files,    
             'packages': packages,
          },    
      }
      

    第二次编辑:

    1. 尝试简单地将_cffi_backend 添加到build_exe 脚本中build_exe 选项的includes 列表中:

      includes = ['_cffi_backend']
      options = {
          'build_exe': {
             'includes': includes,    
             'packages': packages,
          },    
      }
      

    【讨论】:

    • 我尝试添加“bcrypt”“paramiko”和“cryptography”,但似乎没有任何改变。我查看了那个路径,有一个名为“cffi_backend.cp37-win_amd64.pyd”的文件这是回溯(与以前几乎相同):C:\Users\cb\Desktop\Python Scripts\Test cx_Freeze install\build\exe.win-amd64-3.7>Test.exe ...文件“C:\Users\cb\AppData\Local\Programs\Python\Python37\lib\site-packages\bcrypt__init_.py ",第 25 行,在 中来自 .导入 _bcrypt ModuleNotFoundError: 没有名为 '_cffi_backend' 的模块
    • 这个文件cffi_backend.cp37-win_amd64.pyd的确切路径是什么?如果您将其副本放入C:\Users\cb\Desktop\Python Scripts\Test cx_Freeze install\build\exe.win-amd64-3.7\lib 和/或C:\Users\cb\Desktop\Python Scripts\Test cx_Freeze install\build\exe.win-amd64-3.7(在构建可执行文件之后)会发生什么?那么 exe 是否可以正常工作,还是会出现不同的错误?
    • cffi_backend 文件位于您所说的同一目录中 (c:\users\cb\AppData\Local\Programs\Python\Python37\lib\site-packages\cffi_backend.cp37- win_amd64.pyd)。在我将该文件复制到 exe 所在的同一目录后(python scripts\Test cx_Freeze install\build\exe.win-amd64-3.9),构建的 exe 工作正常。谢谢!如果我将它放到创建的 lib 目录 cx_freeze 中,它也可以工作。我很好奇为什么它没有被复制或者安装程序打算将该文件放在哪里。
    • @MocApocalypse 听起来很棒!我已经相应地修改了我的答案。
    • 是的,将 _cffi_backend 显式添加到包列表中也可以解决此问题。
    【解决方案2】:

    感谢 jpeg 提供有助于解决此问题的重要建议。我要做的就是将_cffi_backend.cp37-win_amd64.pyd 复制到构建的可执行文件旁边的lib 目录中。

    你可以在你的 python 安装下找到这个文件 ([Python version]\Lib\site-packages\_cffi_backend.cp37-win_amd64.pyd)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-18
      • 2016-04-28
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多