我尝试在InnoSetup生成的设置中运行python脚本,但没有任何效果。 根据我调用它的方式,运行部分或代码部分结果代码中的执行代码都不同。
当然我在安装过程中安装了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也
有人已经成功使用了与innosetup的python脚本吗?
这样做的目的不是分发应用程序的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),但它不起作用。
当我使用命令行为所有用户安装python时ALLUSERS = 1现有用户(或管理员)可以运行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));
答案 0 :(得分:3)
我怀疑问题是安装程序启动时路径中不存在python,并且在程序运行的范围内未设置路径和其他环境变量(如PYTHONPATH)。
存在两种不同的可能性:
PYTHONPATH
之类的东西 - 你可以通过测试
在测试脚本时使用命令行中的-E标志。python somescript.py
to,(对于Windows),start python
somescript.py
应该很好地完成工作。