Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用innoSetup执行python脚本_Python_Installation_Inno Setup_Python 3.3 - Fatal编程技术网

如何使用innoSetup执行python脚本

如何使用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

我尝试在InnoSetup生成的安装过程中运行python脚本,但没有任何效果。 Run部分或Exec in 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;
我试图在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)未在程序运行的范围内设置

存在两种不同的可能性:

  • 使用python安装到的绝对路径调用python 要执行的脚本的绝对路径,并在脚本中显式显示 如有必要,设置类似于
    PYTHONPATH
    的内容-您可以通过 在测试脚本时使用命令行中的-E标志
  • 启动一个新的shell,它将在它的 而不是在当前环境中运行 进程正在运行-要执行此操作,只需从
    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));