3

cx_freeze を使用して Python ツールをパッケージ化できますが、必要なライブラリをロードできません。何らかの理由で、出力された実行可能ファイル/バイナリ名がパスに含まれ続けます。

次のエラーが表示されます。

OSError: /home/derekx/sbu/build/exe.linux-x86_64-2.7/secure_boot_utility/lib/libcrypto.so.1.0.0: 共有オブジェクト ファイルを開けません: ディレクトリではありません

ライブラリは /home/derekx/sbu/build/exe.linux-x86_64-2.7/lib/libcrypto.so.1.0.0 にパッケージ化されます

作成されたバイナリ「secure_boot_utility」も build/exe.linux86_64-2.7 ディレクトリにあります。

入力スクリプトと setup.py は /home/derekx/sbu にあります。

ツール/依存関係をパッケージ化するために「python setup.py build」を使用しました。

どんな助けでも大歓迎です。オプションの組み合わせを試しましたが、それでも同じエラーが発生します。

私の setup.py は次のとおりです。

import sys
from cx_Freeze import setup, Executable

sys.path.append('sbu_scripts/')
sys.path.append('lib/')

binincludes = ['libcrypto.so.1.0.0']
binpaths = ['/home/derekx/sbu/lib']
includefiles = [('lib/libcrypto.so.1.0.0','lib/libcrypto.so.1.0.0'),]

exe = Executable(
    script="secure_boot_utility.py",
    )

setup(
    name = "SecureBoot",
    version = "0.1",
    description = "Test Secure Boot",
    options = {"build_exe": {'copy_dependent_files':True, 'create_shared_zip':True, 'bin_includes':binincludes, 'bin_path_includes':binpaths, 'include_files':includefiles}},
    executables = [exe]
    )
4

1 に答える 1

3

最上位ディレクトリ (getcwd) が実行可能ファイル名である理由がわかりません。

とにかく、os.path.exists を使用してコードに何かを追加し、LoadLibrary に送信される値を再調整することができました。

応答するために時間を割いてくれてありがとう、トーマス。

これはもともと私がサポートしなければならなかった他人のツールです。sys.path[0] を使用して現在の作業ディレクトリを取得し、ロード中のライブラリへのフル パスを作成していました。cx_freeze で作成された実行可能ファイルが常に実行可能ファイル名を現在の作業ディレクトリに埋め込んでいる理由はわかりません。

私がそれを修正した方法は、構築されるライブラリのフルパスが os.path.exists で存在するかどうかを確認しました:

if os.path.exists(path_to_lib) is False:
    path_to_lib = LibName

return path_to_lib

このようにして、フルパスが存在する場合は機能し、LD_LIBRARY_PATH 環境設定から取得する必要がある LibName を使用しない場合は機能します。

于 2013-04-04T23:57:22.880 に答える