0

VC++ を使用して動的 python ファイル (pyd) を作成しました。cx_freeze を使用して、exe を作成しました。このプログラムを他のコンピューターで動作させるには、アプリケーション フォルダーに msvcr100.dll ファイルが必要です。そして、私は目的の出力を取得します。

ただし、Microsoft の配布ライセンスでは、dll ファイルはアプリケーション フォルダー内のサブ フォルダーに配置する必要があると明記されています。サブフォルダーの名前は「Microsoft.VC100.CRT」にする必要があります。プロジェクトのプロパティを変更して、MS VC++ の設定をいじってみました。私が MSVC++ を使用したのは、Python プログラムで c オプションを使用し、Python プログラムで再び使用できる出力を返すことだけだったので、非常にトリッキーであることがわかりました。私はマニフェストファイル(埋め込みと埋め込みなし)をいじり、VC ++で追加ライブラリディレクトリも設定しました

私のpydファイルをMicrosoft.VC100.CRTに見せるために私ができることについて、誰もがアイデアを得ました。

4

2 に答える 2

1

あなたのスクリプトで DLL がいつロードされるかはわかりませんが、それについて何かできるようになるまで遅延していると仮定すると、自分でライブラリをロードしてみることができます。

import os
import ctypes
try:
    here = os.path.dirname(__file__)
except NameError:
    here = os.getcwd()
dll = ctypes.CDLL(os.path.join(here, 'Microsoft.VC100.CRT', 'msvcr100.dll'))
del here

またはpywin32で

import os
import win32api
try:
    dll = win32api.LoadLibrary('msvcr100.dll') #Never hurts to try
except win32api.error:
    try:
        here = os.path.dirname(__file__)
    except NameError:
        here = os.getcwd()
    #Just to prove messing with PATH does something.
    os.environ['PATH'] = os.environ['PATH'] + os.pathsep + os.path.join(here, 'Microsoft.VC100.CRT')
    dll = win32api.LoadLibrary('msvcr100.dll') #Give it another crank of the handle.
    #Or alternatively without messing with PATH
    dll = win32api.LoadLibrary(os.path.join(here, 'Microsoft.VC100.CRT', 'msvcr100.dll')) #Give it another alternative crank of the handle.
    del here
于 2011-09-29T11:56:27.943 に答える
0

私が作成した動的な python ファイルは、Visual C++ 2010 を使用してコンパイルされました。したがって、それを機能させるには、MSVCR100.dll ファイルが必要でした。ただし、最終プログラムのアプリケーション (.exe) も作成していたため、MSVCR90.dll に依存していました。Microsoft は、これらの dll を特定の名前のフォルダーに配置する必要があると主張しているため、これらのファイルをアプリケーション フォルダーに配置することはできませんでした。したがって、Visual C++ 2008 を使用して pyd ファイルをコンパイルしました。次に、対応するマニフェストと MSVCP90.dll および MSVCM90.dll ファイルと共に MSVCR90.dll ファイルを追加しました。これで問題は解決しました。

私の推測では、私のプログラムが機能する前に、2 世代の C ランタイム ファイルが必要でした。VC++2008 を使用して pyd ファイルをコンパイルすることで、その依存関係を効果的に 1 世代に減らしました。

于 2011-10-10T19:16:01.960 に答える