繁体   English   中英

包括带有 cx_freeze 的编译扩展

[英]Including compiled extension with cx_freeze

我有一个使用scikit-build 构建的 C 扩展(因为它使用 CMake 库),并且在 python 中导入时它构建良好并且工作正常。

然后,我尝试构建使用cx-freeze扩展的脚本,该扩展正在构建,但我看到“缺少模块”下列出了扩展:

Missing modules:
? _atscManufacturing imported from atsc.atscManufacturing.atscManufacturing

当我从命令提示符运行构建的可执行文件时,它会挂起几秒钟,然后退出而没有输出。

我见过这个解决方案,它建议使用Extension添加 C 扩展,但这似乎是要编译库而不是只包含编译的库。 我认为这行不通,因为它需要构建 CMake 库。

这是我的主要setup.py

from cx_Freeze import setup, Executable

# Dependencies are automatically detected, but it might need fine tuning.
build_exe_options = {"packages": ["os", "atsc.atscManufacturing.atscManufacturing", "intelhex", "logging", "atexit", "sys"], "excludes": []}

base = None

setup(  name = "Manufacturing script",
    version = "1.0.0",
    description = "manufacturing script",
    options = {"build_exe": build_exe_options},
    executables = [Executable("main.py", base = base)])

这是./atsc扩展名的setup.py

from skbuild import setup

setup(
    name="atscManufacturing",
    version="0.1",
    packages=['atscManufacturing']
)

我能够让它工作,有几个问题:

  1. 我正在使用python setup.py build来构建 atscManufacturing 模块。 这将在构建目录中构建库。 我添加了--inplace选项来输出模块中的库。
  2. 该模块链接了一个正在构建为共享库的 C 库。 根据此问题,无法使用 scikit-build 复制到已编译的共享库中。 可以使用自定义脚本将其从构建目录复制到模块目录中,但我只是将 C 库更改为静态构建,以便将其编译到 pyd 库中。 这个问题令人困惑,因为我收到错误“python ImportError:导入 _atscManufacturing 时 DLL 加载失败:找不到指定的模块。” 这并不是说找不到 _atscManufacturing,而是说找不到 _atscManufacturing 所依赖的共享库。 我通过从 Visual Studio 命令提示符运行dumpbin /dependents _atscManufacturing.cp310-win_amd64.pyd来解决这个问题,其中列出了有问题的共享库
  3. 我正在使用 SWIG 生成包装器,出于某种原因,它生成的 python 文件在使用 python 运行时运行良好,但在从 cx-freeze exe 运行时失败(没有错误)。 幸运的是,我不需要它,并在__init__.py加载了模块,所以我只是删除了该文件并更改了主 python 文件中的导入。 没有错误使得调试变得困难,我求助于添加print调用来查看脚本失败的地方。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM