12

これは、cx_Freeze メーリング リストで何度も取り上げられています。

(見る

cx_Freeze とファイルの移動

Python アプリケーションをフリーズするときに作成するファイルの数を減らす

cx_freeze python 単一ファイル? )

それは簡単な修正であるべきだと私には思えますが、どうやって始めたらいいのかわかりません。

私は、scipy、wxpython、numpy、およびそれぞれが動的にリンクされたライブラリが多数ある他のパッケージに依存する python アプリケーションを持っています。メインの実行可能フォルダーは、PYD および DLL ファイルで非常に雑然としており、すべてのファイルの中から実行可能ファイルを見つけることさえ困難です。私のユーザーは特にコンピューターに精通しているわけではないので、明確にすることが非常に重要です。

理論的にはbbfreezeによって生成できるような単一の実行可能ファイルは必要ありません。distutils setup.py ファイルが cx_Freeze とどのように連携するかが気に入っており、その他すべての点で cx_Freeze は非常に優れています。

私が欲しいのは、メインの実行可能フォルダーをクリーンアップする方法だけです。DLLファイルをfreeze_libsフォルダーなどに手動で移動してから、可能であれば共有ライブラリーのロードパスを変更して、動的ライブラリーを見つけられるようにすることに完全に満足しています。またはそのようなもの。

ありがとう

4

2 に答える 2

3

「手動で」やりましたが、これは正しい方法ですか?私はwin7 x64 cx_freeze 4.3.2を使用しています

Console.pyとを組み合わせた私の init_scriptConsoleSetLibPath.py

import encodings
import os
import sys
import warnings
import zipimport

paths = os.environ.get("LD_LIBRARY_PATH", "").split(os.pathsep)
if DIR_NAME not in paths:
    paths.insert(0, DIR_NAME)
    os.environ["LD_LIBRARY_PATH"] = os.pathsep.join(paths)
    os.execv(sys.executable, sys.argv)

sys.frozen = True
sys.path = sys.path[:4]

# i added this line
sys.path.append(r'lib')

os.environ["TCL_LIBRARY"] = os.path.join(DIR_NAME, "tcl")
os.environ["TK_LIBRARY"] = os.path.join(DIR_NAME, "tk")

m = __import__("__main__")
importer = zipimport.zipimporter(INITSCRIPT_ZIP_FILE_NAME)

# The following if/else is copied from ConsoleSetLibPath.py
if INITSCRIPT_ZIP_FILE_NAME != SHARED_ZIP_FILE_NAME:
    moduleName = m.__name__
else:
    name, ext = os.path.splitext(os.path.basename(os.path.normcase(FILE_NAME)))
    moduleName = "%s__main__" % name

code = importer.get_code(moduleName)
exec code in m.__dict__

versionInfo = sys.version_info[:3]
if versionInfo >= (2, 5, 0) and versionInfo <= (2, 6, 4):
    module = sys.modules.get("threading")
    if module is not None:
        module._shutdown()

次に、このファイルをsetup.pyC:\Python27\Lib\site-packages\cx_Freeze\initscriptsとして保存します。ConsoleSetLibPathx.py

setup(
    name = 'xxx',
    version = '0.1',
    options = {'build_exe': {'includes':includes,
                             'excludes':excludes,
                             'packages':packages,
                             'include_files':includefiles,
                             'create_shared_zip':True,
                             'include_in_shared_zip':True,
                              # use the "hacked" init_script ?
                             'init_script':'ConsoleSetLibPathx',
                             'include_msvcr':True,
                             }

                             }, 
    executables = [exe]
)

# Am i supposed to do the mkdir lib , and copy *.pyd *.dll into it in the end of this setup.py here? 
# I verified this is working by manually creating lib dir and copy all files inside, it works.

オプションかどこかでそれを行うべきだと思いますが、現在 cx_freeze のドキュメントをよく理解していません。おそらく --target-dir または --default-path または --replace-paths ? それらを使用する方法がわからない

編集:申し訳ありませんが、これを改善する必要があります.vmwareの別のクリーンなwin7でこれをテストすると、動作していますが、動作がおかしいです.非ブロック読み取りキープレスのコードが機能していません. どの部分が間違っているかわかりません。

于 2014-03-08T07:44:21.640 に答える