簡體   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