使用 cx_Freeze 构建的 Exe 在包含 pysftp 导入时显示错误

Exe built with cx_Freeze shows error when containing pysftp import

我正在尝试从使用 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-64 位和 windows 10.

  1. 尝试将 "paramiko""bcrypt" 添加到 setup.py 脚本中的 packages 列表中。如果这仍然不起作用,请post你应该得到的新回溯。

    编辑:根据 OP,这没有解决问题。

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

    编辑:根据 ,有文件 [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 添加到 setup.py 脚本中 build_exe 选项的 includes 列表中:

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

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

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