亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 PyInstaller 將 Cython 編譯的模塊和 python 代碼構建為可執行

使用 PyInstaller 將 Cython 編譯的模塊和 python 代碼構建為可執行

慕娘9325324 2022-01-11 18:01:19
我正在嘗試使用Cython和PyInstaller庫將我的項目代碼打包成可執行二進制文件。我的代碼目錄如下所示:的main.py是從進口邏輯主代碼program_a.py和program_b.py。我成功地將我的program_a和program_b文件轉換為可以由任何 python 代碼導入的 .so 文件。我通過執行以下腳本來做到這一點。from distutils.core import setupfrom Cython.Build import cythonizesourcefiles = ['program_a.py', 'program_b.py']setup(    name = "Hello World",    ext_modules = cythonize(sourcefiles), )通過執行 >python setup.py build_ext --inplace我得到.so如下所示的文件當我運行python main.py它時,它可以完美地與.so文件一起運行。這表明我可以將它們作為模塊導入?,F在,我想將二進制 (.so) 文件打包main.py成單個二進制文件。為此,我使用了以下命令pyInstallerpyinstaller "main.py" --onefile它實際上在dist/文件夾中提供了一個二進制文件,但我無法導入某些模塊并出現以下錯誤:Traceback (most recent call last):  File "main.py", line 1, in <module>    import program_a as lisence_checker  File "program_a.py", line 1, in init program_aModuleNotFoundError: No module named 'licensing'[18032] Failed to execute script main如何將庫與 pyinstaller 鏈接或將庫信息嵌入到我的二進制文件中?我還發現了什么:使用 PyInstaller 構建 Cython 編譯的 python 代碼https://riptutorial.com/cython/example/21982/bundling-a-cython-program-using-pyinstaller但是所有這些上面的鏈接都沒有在 python 代碼示例中使用任何外部包。我能夠在沒有外部模塊的情況下編譯代碼
查看完整描述

2 回答

?
慕運維8079593

TA貢獻1876條經驗 獲得超5個贊

在熟悉 PyInstaller 包后,我能夠找出問題所在。我按照以下步驟使其最終為我工作。


現在,發布我的答案以幫助他人:)


## Build *.so files from python modules 

    1. Execute "setup.py" file

       > python setup.py build

    2. It will generate "*.so" modules inside "build/lib.linux-x86_64-3.6" dir.


## Created binary from cython modules

    1. Copy the binaries (i.e. *.so) files into binary folder

    2. Get inside the binary folder 'cd binary'

    3. Run Pyinstaller command inside binary directory: `python -O -m PyInstaller --clean --onefile idps.spec`

    4. Your binary will be inside dist folder 'binary/dist/'

    5. Execute the binary in linux using './dist/sample_app'

    6. Your app is ready :)

這是使它對我有用的規范文件:


# -*- mode: python -*-


block_cipher = None



a = Analysis(['main.py'],

             pathex=['cython_pyinstaller_sample/binary'],

             binaries=[('program_a.cpython-36m-x86_64-linux-gnu.so', '.'),('program_b.cpython-36m-x86_64-linux-gnu.so', '.')],

             datas=[('config_file.txt', '.')],

             hiddenimports=['licensing', 'licensing.methods', 'pandas'],

             hookspath=[],

             runtime_hooks=[],

             excludes=[],

             win_no_prefer_redirects=False,

             win_private_assemblies=False,

             cipher=block_cipher,

             noarchive=False) pyz = PYZ(a.pure, a.zipped_data,

             cipher=block_cipher) exe = EXE(pyz,

          a.scripts,

          a.binaries,

          a.zipfiles,

          a.datas,

          [],

          name='sample_app',

          debug=True,

          bootloader_ignore_signals=False,

          strip=False,

          upx=True,

          runtime_tmpdir=None,

          console=True )


查看完整回答
反對 回復 2022-01-11
?
胡說叔叔

TA貢獻1804條經驗 獲得超8個贊

以防萬一有人在尋找快速解決方案。

我遇到了同樣的情況,并找到了一種快速/骯臟的方式來完成這項工作。問題是 pyinstaller 沒有在 .exe 文件中添加運行程序所需的必要庫。

您需要做的就是將所需的所有庫(和 .so 文件)導入 main.py 文件(調用 program_a.py 和 program_b.py 的文件)。例如,假設 program_a.py 使用 opencv 庫 (cv2) 而 program_b.py 使用 matplotlib 庫?,F在在您的 main.py 文件中,您還需要導入 cv2 和 matplotlib?;旧希瑹o論你在 program_a.py 和 program_b.py 中導入什么,你也必須在 main.py 中導入它。這告訴 pyinstaller 程序需要這些庫,并將這些庫包含在 exe 文件中。


查看完整回答
反對 回復 2022-01-11
  • 2 回答
  • 0 關注
  • 355 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號