2013-09-26 116 views
6

Tôi cố gắng chạy một kịch bản python trong một thiết lập tạo ra bởi InnoSetup, nhưng không có gì hoạt động. Không có phần Chạy hoặc Exec trong phần mã Mã kết quả khác nhau tùy thuộc vào cách tôi gọi nó.Làm thế nào để thực hiện một kịch bản python với innoSetup

Tất nhiên tôi cài đặt Python trong khi thiết lập nếu nó chưa có. Đây là mã kiểm tra 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; 

tôi Cố gắng sử dụng trực tiếp python.exe trong Run phần và trong mã: Exec nhưng không có cách nào.

Và tất nhiên nếu tôi gõ test.py trong cửa sổ dòng lệnh nó hoạt động, và cmd.exe /cC:\python33\python.exe C: \ ứng dụng \ test.py cũng

Ai đó đã succes sử dụng kịch bản python với innosetup?

Mục đích của việc này không phải là phân phối tệp py của ứng dụng mà sử dụng tập lệnh python trong quá trình cài đặt để thực hiện một số nội dung.

Bây giờ tôi m' sử dụng CXfreeeze để thực hiện một exe của các kịch bản nhưng tôi muốn giữ chỉ kịch bản python và không exe (cho mục đích automatisation)

để biết thông tin python kịch bản thử nghiệm chỉ là:

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

EDIT *

Như @Tlama đề nghị tôi đã cố gắng sử dụng các lệnh trong [Run] sử dụng OriginalUser thay cho chế độ quản trị setted bởi INNO (tôi đang sử dụng các PrivilegesRequired = admin) nhưng nó không hoạt động.

Và khi tôi cài đặt python cho tất cả người dùng bằng dòng lệnh ALLUSERS = 1 người dùng hiện tại (hoặc quản trị viên) có thể chạy tập lệnh python.

tôi cũng cố gắng để thay đổi WorkingDir trong [Run] và trong Mã sản phẩm: Exec nhưng tất cả tentatives cho tôi ResultCode cùng "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 

trong Mã sản phẩm:

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

Có Tôi cũng thử: "python.exe" "C: \ pyhton33 \ pyhton.exe test.py" ngay cả chỉ kịch bản thứ (python và .py được liên kết với python.exe) "test.py" không có gì hiệu quả. – user2819873

+0

Cảm ơn sự giúp đỡ của bạn! Tôi thử sử dụng originalUser, nó cũng không có tác dụng. Tôi đã không đề cập đến nhưng tôi cố gắng một số workingdir (pyhton một, ứng dụng một ..) nó không có effet. Tôi nghĩ rằng nó liên quan đến python nhưng điều này thực sự lạ – user2819873

+0

Ok cảm ơn bạn, tôi sử dụng Inno trong nhiều năm, nhưng lần này tôi thực sự bị mắc kẹt. – user2819873

Trả lời

3

tôi nghi ngờ rằng vấn đề là python không tồn tại trên đường dẫn khi trình cài đặt bắt đầu và đường dẫn đó và các biến môi trường khác như PYTHONPATH không được đặt trong phạm vi chương trình đang chạy.

Hai khả năng riêng biệt tồn tại:

  1. Gọi python với nó là đường dẫn tuyệt đối rằng nó đã được cài đặt để, các đường dẫn tuyệt đối của kịch bản để thực hiện và trong kịch bản của bạn một cách rõ ràng bộ những thứ như PYTHONPATH nếu cần thiết - bạn có thể kiểm tra điều này bằng cách sử dụng cờ -E từ dòng lệnh khi kiểm tra tập lệnh của bạn.
  2. Khởi chạy tiện ích mới, trong đó sẽ có được con đường mới, vv, trong đó là môi trường chứ không phải chạy trong một hiện tại mà hiện tại quá trình đang chạy trong - để làm điều này chỉ đơn giản là thay đổi lệnh của bạn từ python somescript.py đến, (đối với cửa sổ), start python somescript.py nên thực hiện công việc một cách độc đáo.
+0

Đối với trường hợp này âm thanh tốt hơn tùy chọn đầu tiên ... Có cần phải xác định rõ ràng một thư mục làm việc (tôi không biết, với một số đường dẫn thư viện của Python)? Làm thế nào về đặc quyền Python nên chạy? Trình cài đặt thường chạy với đặc quyền của quản trị viên, bạn có nên chạy nó như người dùng ban đầu không? – TLama

+0

Đường dẫn bắt buộc là những gì bạn kiểm tra với python -E yourscript.py - đặc quyền quản trị không phải là vấn đề. –

+0

Tôi không, vì tôi không có thời gian để chơi với Python :-) Đó là khi OP. Tuy nhiên, 168 người dùng đã nhìn thấy câu hỏi này là khá đủ. Bounty bây giờ là của bạn ;-) Tôi chỉ tự hỏi rằng chỉ có một câu trả lời đã được đăng. Thật khó để thực thi Python từ * ứng dụng nước ngoài * thông qua dòng lệnh hay chỉ là không ai làm điều đó? – TLama