gpt4 book ai didi

python - 如何使用 innoSetup 执行 python 脚本

转载 作者:太空狗 更新时间:2023-10-30 00:11:20 24 4
gpt4 key购买 nike

我尝试在 InnoSetup 生成的设置期间运行 python 脚本,但没有任何效果。Run 部分或 Exec in code section Result code 都不同,这取决于我调用它的方式。

当然,如果 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;

我尝试在运行部分和代码中直接使用 python.exe:Exec 但没有办法。

当然,如果我在 Windows 命令行中键入 test.py,它就可以工作,并且 cmd.exe/cC:\python33\python.exe C:\app\test.py 也是

有人已经成功地将 python 脚本与 innosetup 一起使用了吗?

这样做的目的不是分发应用程序的 py 文件,而是在安装过程中使用 python 脚本来制作一些东西。

现在我正在使用 CXfreeeze 制作脚本的 exe,但我更喜欢只保留 python 脚本而不是 exe(用于自动化目的)

有关 python 测试脚本的信息:

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

编辑 *

正如@Tlama 建议的那样,我尝试使用 OriginalUser 而不是 inno 设置的管理模式来使用 [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));

最佳答案

我怀疑问题是安装程序启动时路径上不存在 python,并且该路径和其他环境变量(例如 PYTHONPATH)未在程序运行的范围内设置。

存在两种截然不同的可能性:

  1. 使用安装它的绝对路径调用 python,要执行的脚本的绝对路径以及在您的脚本中显式如有必要,设置 PYTHONPATH 之类的东西 - 您可以通过以下方式进行测试在测试脚本时使用命令行中的 -E 标志。
  2. 启动一个新的 shell,它将在其中获取新的路径等环境而不是在当前环境中运行进程正在运行 - 要做到这一点,只需将您的命令从python somescript.py 到,(对于 windows),启动 python
    somescript.py
    应该能很好地完成这项工作。

关于python - 如何使用 innoSetup 执行 python 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19031223/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com