如何使用innoSetup执行python脚本
我尝试在InnoSetup生成的安装过程中运行python脚本,但没有任何效果。 Run部分或Exec in code部分的结果代码都不一样,这取决于我调用它的方式 当然,如果Python还没有出现,我会在安装过程中安装它。 这是Inno的测试代码如何使用innoSetup执行python脚本,python,installation,inno-setup,python-3.3,Python,Installation,Inno Setup,Python 3.3,我尝试在InnoSetup生成的安装过程中运行python脚本,但没有任何效果。 Run部分或Exec in code部分的结果代码都不一样,这取决于我调用它的方式 当然,如果Python还没有出现,我会在安装过程中安装它。 这是Inno的测试代码 [Setup] AppName=PyPy_client AppVersion=0.1 DefaultDirName={pf}\DeployPyPy UninstallDisplayIcon={app}\test.py Compression = zi
[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也会工作
有人已经成功地将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在[Run]中使用命令,而不是inno设置的管理模式(我使用PrivilegesRequired=Admin),但它不起作用
当我使用命令行ALLUSERS=1为所有用户安装python时,现有用户(或管理员)可以运行python脚本
我还尝试在[Run]和CODE:Exec中修改WorkingDir,但所有的tentative都给了我相同的结果代码“2”
代码:
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)未在程序运行的范围内设置 存在两种不同的可能性:
PYTHONPATH
的内容-您可以通过
在测试脚本时使用命令行中的-E标志pythonsomescript.py
to,(对于windows),start python
somescript.py应该可以很好地完成这项工作
是的,我也尝试了:“python.exe”“C:\pyhton.33\pyhton.exe test.py”甚至只有th脚本(python和.py链接到python.exe)“test.py”都不起作用。谢谢你的帮助!我尝试使用originalUser,它也没有效果。我没有提到,但我尝试了几个workingdir(pyhton one,app one…),它没有效果。我认为它与python有关,但这真的很奇怪好吧,谢谢你,我使用Inno多年了,但这次我真的被卡住了。创建一个ms批处理文件(比如dopython.bat)并将python代码作为py文件本身作为安装的一部分来安装怎么样。批处理文件将触发python文件,python文件的最终代码段将是删除自身(以及生成的pyc文件)的指令,完成后触发批处理文件。然后使用inno安装程序的执行方法触发批处理脚本并捕获结果。。。是否需要显式地指定一个工作目录(我不知道,到一些Python的库路径)?Python应该运行的权限如何?安装程序通常以管理员权限运行,您建议以原始用户的身份运行吗?所需路径是您使用python测试的-E yourscript.py-管理员权限不应该是问题。我没有,因为我没有时间玩python:-)这是在OP上。然而,168个用户已经看到了这个问题,这已经足够了。赏金现在是你的了;-)我只是想知道只有一个答案被贴出来了。通过命令行从外国应用程序执行Python有那么难吗?还是没有人在这么做?谢谢@TLama-我注意到很多人对任何基本上是命令行的东西都避而远之。
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));