2

外部 CATIA アプリケーションを制御するために、いくつかの Python スクリプトを作成しました。これらのスクリプトを実行可能ファイルにパッケージ化する必要がありますが、それを行うことができません。

質問 :

スクリプトがビルドされたら、win32com が特定のモジュールに対して早期バインディングを使用するように強制するにはどうすればよいですか?


詳細 :

私のスクリプトは、 win32com.clientモジュールを使用して CATIA アプリケーションを制御します。参照入出力引数を持つ関数を含むモジュールCATIA V5 SpaceAnalysisInterfaces Object Libraryを除いて、レイト バインディングで CATIA を処理します。これにはアーリー バインディングを使用します。悲しいことに、 MakePyの単純な使用では十分ではありませんでした。入力/出力引数から正しい動作を取得するために、 win32com.gen_pyパッケージから生成されたソースを変更する必要がありました。Pythonスクリプトを実行すると正常に動作するようになりました。しかし、py2exeまたはcx_freezeのいずれかを使用してそれらをビルドすると、実行可能ファイルは遅延バインディングのみを使用するため、悪い結果が得られます。

CATIA アプリケーションをフックしてその API を使用する方法は次のとおりです。

import win32com.client

buff = [0, 0, 0]

catApp = win32com.client.GetActiveObject("CATIA.Application") # Late bind needed
doc = catApp .Documents.Open(path)
part = doc.Part # This property fails if using early binding
spa = doc.GetWorkbench(u"SPAWorkbench")

I = spa.Inertias.Add(part) # Early bind needed

cogCoords = I.GetCOGPosition(buff) # The damn input/ouput argument function

cx_freezeを使用したビルド スクリプトは次のとおりです。

from cx_Freeze import setup, Executable

options = {
    "includes": [],
    "excludes": [],
    "packages": ["win32com.gen_py"]
    }

target = Executable(
    script = "test.py",
    base = "Console",
    compress = True,
    icon = None,
    )

setup(
    name = "Test",
    version = "1.0",
    description = "Early Binding Test Built",
    author = "C.LECLERC",
    options = {"build_exe": options},
    executables = [target]
    )

このビルド スクリプトは、実際のwin32com.gen_pyモジュールのコンテンツを含む一連のファイルを生成するので、動作するはずです。しかし、ファイルを実行すると、遅延バインディングのみが使用されます。py2exeを使用したときにファイルが正しく追加されているかどうかを確認できませんでしたが、動作はまったく同じです: late bind !


この投稿を見ましたが、私の問題は異なります。モジュールは正しくコピーされ、スクリプトは例外を発生させません。入出力関数が正しく機能しません。

どんな助けでも大歓迎です。

4

1 に答える 1

1

私は自分の質問に答えて、見つけた解決策を共有し、問題に解決済みのフラグを立てます。

解決 :

「dicts.dat」ファイルをwin32com.gen_pyパッケージから、cx_freeze によって生成された「library.zip」アーカイブの同等のフォルダーにコピーするだけです。

于 2013-11-30T13:27:13.617 に答える