7

InnoSetup によるセットアップ生成中に python スクリプトを実行しようとしましたが、何も機能しません。Run セクションも Exec in code セクションも Result コードは、呼び出し方によって異なります。

もちろん、まだ存在しない場合は、セットアップ中に Python をインストールします。ここにテストコードInnoがあります

[Setup]
AppName=PyPy_client
AppVersion=0.1
DefaultDirName={pf}\DeployPyPy
UninstallDisplayIcon={app}\test.py
Compression = zip/1
OutputDir=deploy
SetupLogging = yes
UsePreviousGroup=False
DisableProgramGroupPage=yes
PrivilegesRequired = admin

[Files]
Source: "D:\Dev\deploy_python\python-3.3.2.msi"; DestDir: "{app}\deploy"; Flags: ignoreversion
Source: "D:\Dev\deploy_python\test.py"; DestDir: "{app}"; Flags: ignoreversion 

[Run]
Filename: "msiexec"; Parameters: "/i ""{app}\deploy\python-3.3.2.msi"" /qb! ALLUSER=1 ADDLOCAL=ALL"; WorkingDir: "{app}\deploy"; Flags: 32bit; Check: python_is_installed
Filename: "cmd.exe"; Parameters: "/c{code:GetPythonPath}\python.exe {app}\test.py"; WorkingDir: "{app}"; Flags: waituntilterminated

[Code]
function python_is_installed() : Boolean;
var 
  key : string;
begin
  //check registry 
   key := 'software\Python\PythonCore\3.3\InstallPath'
   Result := not RegValueExists(HKEY_LOCAL_MACHINE,Key,'');   
end;

function GetPythonPath(Param : String) : String;
var dir, key : String;
begin
  dir := '';
  key := 'software\Python\PythonCore\3.3\InstallPath'
  RegQueryStringValue(HKEY_LOCAL_MACHINE,key,'',dir);
  Result := dir
end;

procedure DeinitializeSetup();
var
  ResultCode: integer;
begin
  if Exec('cmd.exe', ExpandConstant('/c' +GetPythonPath('')+ '\python.exe {app}\test.py'), '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
    Log(intTostr(Resultcode));
end;

Runセクションとcode:Execでpython.exeを直接使用しようとしましたが、方法はありません。

そしてもちろん、Windowsコマンドラインでtest.pyと入力すると動作し、cmd.exe /cC:\python33\python.exe C:\app\test.pyも

誰かが innosetup で python スクリプトを使用して既に成功していますか?

これの目的は、アプリの py ファイルを配布することではなく、インストール プロセス中に python スクリプトを使用して何かを作成することです。

現在、CXfreeeze を使用してスクリプトの exe を作成していますが、exe ではなく Python スクリプトのみを保持することを好みます (自動化の目的で)。

参考までに、pythonテストスクリプトは次のとおりです。

import ctypes
def msgbox(message,title):
    ctypes.windll.user32.MessageBoxW(0, message, title, 0)
def debug() : 
    msgbox('test','test test')
debug()

編集 *

@Tlama が示唆するように、inno によって設定された管理者モードの代わりに OriginalUser を使用して [Run] でコマンドを使用しようとしましたが (PrivilegesRequired = admin を使用しています)、機能しません。

また、コマンドライン ALLUSERS=1 を使用してすべてのユーザーに python をインストールすると、既存のユーザー (または管理者) は python スクリプトを実行できます。

また、[Run] と CODE:Exec で WorkingDir を変更しようとしましたが、すべての暫定的な結果で同じ ResultCode "2" が返されました。

Filename: "cmd.exe"; Parameters: "/c{code:GetPythonPath}\python.exe {app}\test.py"; WorkingDir: "{app}"; Flags: waituntilterminated
Filename: "cmd.exe"; Parameters: "/c{code:GetPythonPath}\python.exe {app}\test.py"; WorkingDir: "{code:GetPythonPath}"; Flags: waituntilterminated
Filename: "python.exe"; Parameters: "{app}\test.py"; WorkingDir: "{code:GetPythonPath}"; Flags: waituntilterminated
Filename: "python.exe"; Parameters: "{app}\test.py"; WorkingDir: "{app}"; Flags: waituntilterminated

コード内:

  Log('Start pypy 1');    
  Exec('cmd.exe', ExpandConstant('/c' +GetPythonPath('')+ '\python.exe {app}\test.py'), GetPythonPath(''), SW_SHOW, ewWaitUntilTerminated, ResultCode);
  Log(intToStr(Resultcode));  
  Log('Start pypy 2');    
  Exec(GetPythonPath('')+ '\python.exe', ExpandConstant('{app}\test.py'), GetPythonPath(''), SW_SHOW, ewWaitUntilTerminated, ResultCode);
  Log(intToStr(Resultcode));  
  Log('Start pypy 3');    
  Exec('cmd.exe', ExpandConstant('/c' +GetPythonPath('')+ '\python.exe {app}\test.py'),ExpandConstant('{app}'), SW_SHOW, ewWaitUntilTerminated, ResultCode);  
  Log(intToStr(Resultcode)); 
4

1 に答える 1

5

問題は、インストーラーの起動時にパスに python が存在せず、そのパスと PYTHONPATH などの他の環境変数がプログラムが実行されているスコープに設定されていないことだと思われます。

次の 2 つの異なる可能性があります。

  1. インストール先の絶対パス、実行するスクリプトの絶対パスを使用して python を呼び出し、PYTHONPATH必要に応じてスクリプトで明示的に設定します。スクリプトをテストするときに、コマンド ラインから -E フラグを使用してこれをテストできます。 .
  2. 現在のプロセスが実行されている現在の環境で実行するのではなく、その環境で新しいパスなどを取得する新しいシェルを開始します。これを行うには、コマンドを python somescript.py(Windowsの場合)に変更するだけstart python somescript.pyです。仕事をうまく。
于 2013-10-06T08:43:50.790 に答える