23

私は Windows で開発を行っていますが、この種のことについて話している人を見つけることなく、あらゆる場所を検索しました。

MSVC を使用して Python 3.1 を埋め込んだ C++ アプリをデスクトップに作成しました。python31.lib をリンクし、python31.dll を実行可能ファイルと一緒にアプリの実行フォルダーに含めました。それはうまくいきます。私の拡張機能と埋め込みコードは確実に機能し、クラッシュはありません。

Python をインストールしていない友人に実行フォルダーを送信したところ、スクリプトのセットアップ フェーズ中にアプリがクラッシュしました。

数時間前、私は Python 2.6がインストールされたラップトップでこのアプリを試しました。友人と同じクラッシュ動作が発生し、デバッグを通じて、失敗したのは Py_Initialize() 呼び出しであることがわかりました。

アプリのコードを変更せずに、ラップトップに Python 3.1 をインストールしました。私はそれを実行しましたが、完全に実行されます。Python 3.1 をアンインストールすると、アプリが再びクラッシュします。アプリにコードを挿入して、ローカルの python31.dll から動的にリンクし、それが使用されていることを確認しましたが、それでもクラッシュします。

インタープリターが起動するためにDLL以上のものを必要とするかどうかはわかりません。これに関するリソースを見つけることができませんでした。Python のドキュメントやその他のガイドでは、ユーザーが Python をローカルにインストールすることなく、Python の埋め込みを使用する C/C++ アプリケーションを配布する方法については触れていないようです。Unix よりも Windows で問題になることはわかっていますが、Python をローカルに埋め込む Windows C/C++ アプリケーションを数多く見てきましたが、それらがどのように実装されているかはわかりません。

DLL 以外に何が必要ですか? Python をインストールすると動作し、アンインストールすると動作しなくなるのはなぜですか? とても些細なことのように思えます。たぶんそれが、誰もそれについて本当に話さない理由です。それにもかかわらず、このクラッシュの問題に対処する方法を実際に説明することはできません。

事前にどうもありがとうございました。

4

4 に答える 4

24

pythonxy.dll に加えて、Python ライブラリ全体 (lib フォルダーの内容) と拡張モジュール (DLLs フォルダーの内容) も必要です。標準ライブラリがなければ、Python は os.py (3.x では; 2.x では string.py) を見つけようとするため、起動さえしません。起動時に、いくつかのモジュール、特に site.py をインポートします。

標準ライブラリを検索する場所はさまざまです。あなたの場合、最終的にレジストリでそれを見つけます。以前は、実行可能ファイル名 (Py_SetProgramName で設定) を使用してランドマークを見つけようとしました。また、標準ライブラリの圧縮コピーであるファイル python31.zip もチェックします。また、環境変数 PYTHONHOME もチェックします。

ライブラリから必要のないものを自由に取り除くことができます。依存関係を静的に計算するさまざまなツールがあります (特に modulefinder)。

ファイルの数を最小限に抑えたい場合は、

  1. すべての拡張モジュールを pythonxy.dll に静的にリンクするか、または pythonxy.dll をアプリケーションに静的にリンクします
  2. フリーズツールを使用します。これにより、標準ライブラリのバイト コードを pythonxy.dll にリンクできます。
  3. (または 2.) 標準ライブラリには pythonxy.zip を使用します。
于 2009-09-07T07:16:51.650 に答える
13

良い。圧縮したくない場合は、Python26\DLLs & Python26\lib を次のように exe ディレクトリにコピーします。

.\myexe.exe       
.\python26.dll
.\Python26\DLLs
.\Python26\lib

そして、Py_SetPythonHome() API で PYTHONHOME を設定します。どうやら、この API はPy_Initialize();のに "許可され​​た" 呼び出しのリストに含まれていません。

以下はWindowsで機能しました(Pythonがインストールされていません):

#include "stdafx.h"
#include <iostream>
#include "Python.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
   char pySearchPath[] = "Python26";
   Py_SetPythonHome(pySearchPath);
   Py_Initialize();
   PyRun_SimpleString("from time import time,ctime\n"
                     "print 'Today is',ctime(time())\n");
   //cerr << Py_GetPath() << endl;
   Py_Finalize();

    return 0;
}

検索パスがexeに対して相対的であることは良いことです。Py_GetPath は、モジュールを探しているすべての場所を表示できます。

于 2010-06-03T23:02:34.060 に答える
6

私と同じように、これでまだ問題を抱えている可能性のある他の人のために、いくつかの追加情報を追加したかった. 最終的に、ユーザー sambha によって提案された方法を使用して、アプリケーションを動作させることができました。

プログラム ファイル (x86)\
    MyApplicationFolder\
        MyApplication.exe
        python27.dll
        Python27\
            DLLs\ (DLLs フォルダーの内容)
            Lib\ (Lib フォルダーの内容)

...重要な追加事項が 1 つあります。MSVCR90.DLL もインストールする必要がありました。私はPython 2.7を使用していますが、どうやらpython27.dllにはMSVCR90.DLL(およびおそらく他のMSVC * 90.DLL)が必要です。

http://www.microsoft.com/en-us/download/details.aspx?id=29から「vcredist_x86.exe」パッケージをダウンロード、インストール、実行することでこれを解決しました。確かではありませんが、少なくとも Win7 では、これまでのように MSVC*90.DLL を .exe の横に配置するのではなく、この方法で行う必要があると思います。Microsoft インストーラーはファイルを配置し、Win7 で特別な方法で登録します。

.zip ファイルの方法も試しましたが、MSVCR90.DLL がインストールされていても機能しませんでした。

于 2012-09-21T23:39:36.323 に答える
6

Python 標準ライブラリの zip は、Python27 で機能しました。

Lib と dllの内容を圧縮し、追加の python27-subfolder または Lib または dll サブフォルダーがないことを確認しました。つまり、すべてのファイルを含む python27.zip という名前の zip です。

そのzipとpython27.dllを実行可能ファイルと一緒にコピーしました。

于 2012-02-02T16:25:54.490 に答える