そこで、次の手順を持つインストーラーを作成しようとしています。
- Python がインストールされているかどうかを確認する
- アプリ ファイルをコピーする
- Python インストール ディレクトリが Windows 環境パスにあるかどうかを確認します
- Python スクリプト フォルダーが Windows 環境パスにあるかどうかを確認します。
- scripts フォルダーが env パスにない場合は、追加します
- インストール easy_install
- easy_install を使用して複数のライブラリをインストールする Python スクリプトを実行する
この問題は、最後の数ステップで発生します。現在使用している Inno セットアップに関連するコードは次のとおりです。
begin
case CurStep of
ssInstall: // File transfer is about to begin.
begin
// Note: Use abort(); to terminate the install during this step.
end;
ssPostInstall: // File transfer has finished.
begin
// Make sure Python is in the path.
sPythonInstallDir := _PythonGetInstallDir();
_PathAddToSystem( sPythonInstallDir )
_PathAddToSystem( sPythonInstallDir + 'Scripts;' )
// Run the bundled Python script.
ExtractTemporaryFile( 'build_setup_script.py' );
ExtractTemporaryFile( 'ez_setup.py' );
_LaunchApp( AddQuotes( sPythonInstallDir + 'python.exe' ), AddQuotes( ExpandConstant( '{tmp}\build_setup_script.py' ) ), ExpandConstant( '{tmp}' ), SW_SHOW, ewWaitUntilTerminated, 300, nTime, nResultCode );
end;
ssDone : // After the Finish dialog.
begin
end;
end;
これがpythonスクリプトです:
def main(argv):
## Easy Install
print("Installing easy_install")
call(["Python", "ez_setup.py"])
...
## Installs server.py dependencies
print("\nInstalling SQLAlchemy")
call(["easy_install", "SQLAlchemy==0.7.8"])
...
inno セットアップでは、次のディレクティブもあります
[Setup]
...
ChangesEnvironment=true
...
ただし、この投稿によると、ディレクティブはユーザーが [完了] をクリックした後にのみ有効になります。
したがって、セットアップはパスに追加されます。
...C:\Program Files (x86)\Git\cmd;;C:\Python27\;C:\Python27\Scripts;
しかし、その後、スクリプトが実行されます (inno はパスが変更され、Python ファイルを実行できることを認識しているように見えるため、機能します)、スクリプトは easy_install をインストールしますが、これは何らかの理由で機能しますが、easy_install を使用しようとすると (これが理由です) C:Python\Scripts; がパスにある場合)、ファイルが見つからないという例外がスローされます。
ただし、何も変更せずにインストーラーを 2 回目に実行すると、Python の実行時に easy_install へのパスを検出できるようになったため、easy_install の手順が機能します。
終了をクリックする前にプロセスに通知する方法が必要だと思いますが、前述の投稿のコードをコピーしても inno でコンパイルされません
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, LPARAM(PChar('Environment')), SMTO_ABORTIFHUNG, 5000, MsgResult);
そもそもインストーラーを自動化する必要があるため、ユーザーにもう一度インストールを開始するように求めることは問題外です...何かアイデアはありますか?