[python win32使用Windows Installer API失败,但perl正常-我在python中做错了什么?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[python win32使用Windows Installer API失败,但perl正常-我在python中做错了什么?相关的知识,希望对你有一定的参考价值。

我正在尝试使用python的win32 COM API编辑Windows Installer MSI,但无法正常工作。我的perl应用程序运行正常,但是尽管我的python运行没有错误,但MSI并未更新。我是python的新手,所以可能做一些愚蠢的事情。我的新工作使用的是python而不是perl,所以我非常感谢任何更正(尤其是在错误检测和处理方面)。谢谢!

这里是下面的python的Perl

use Win32::OLE;

my $msifile = "ws.msi";
my($Installer, $database, $query, $view);
$Installer = undef;

Win32::OLE::CreateObject("WindowsInstaller.Installer", $Installer) ||
    die "CreateObject installer failed: $!";
$database = $Installer->OpenDatabase($msifile, 1)  ||
    die "cannot open msi file $msifile (OpenDatabase failed): $!";

my $qry  = "UPDATE `InstallExecuteSequence` SET `InstallExecuteSequence`.`Condition`='1' WHERE `InstallExecuteSequence`.`Action`='CheckAllUserLegacy'";
$view = $database->OpenView($qry);
check_error();
$view->Execute;
check_error();
$database->Commit();
check_error();
print "	$msifile updated 
";   
$record = undef;
$view = undef;
$database = undef;
$Installer = undef;
exit 0;

sub check_error {
    if ( Win32::OLE->LastError() ) {
        printf "SQL ERROR, the following query:
	'==$query==
gets
	(%-s)
", Win32::OLE->LastError();
        exit(1);
    }
}

================================================ =========================>

import pdb;
import win32com.client

msifile = "e:ws.msi"
MSIDBOPEN_TRANSACT = 1
MSIDBOPEN_DIRECT = 2
openMode = MSIDBOPEN_TRANSACT
print "about to open DB"
#pdb.set_trace()

try:
    wi = win32com.client.DispatchEx ( "WindowsInstaller.Installer" )
    db = wi.OpenDatabase( msifile, openMode )
except:
    print "Oops"
else:
    print ("opened OK")

sql = "UPDATE `InstallExecuteSequence` SET `InstallExecuteSequence`.`Condition`='0' WHERE `InstallExecuteSequence`.`Action`='CheckAllUserLegacy'"

#print(sql)
try:
    view = db.OpenView(sql)
except:
    error = wi.LastErrorRecord()
    for field_num in range(1, error.FieldCount + 1):
        print error.StringData(field_num)
else:
    print ("after open view, didn't get exception")

try:
    view.Execute
except:
    error = wi.LastErrorRecord()
    for field_num in range(1, error.FieldCount + 1):
        print error.StringData(field_num)
else:
    print ("view.executed didn't get exception")

try:
    db.Commit
except:
    error = wi.LastErrorRecord()
    for field_num in range(1, error.FieldCount + 1):
        print error.StringData(field_num)
else:
    print ("after commit, didn't get exception")

print "end"

运行perl后,MSI正确更改,但是运行python后,它未更改。我是python新手,但已经使用了perl多年了(这些都是切碎的片段,不是很好的编程示例)

我正在尝试使用python的win32 COM API编辑Windows Installer MSI,但无法正常工作。我的perl应用程序运行正常,但是尽管我的python运行没有错误,但MSI并未更新。我是新来的...

答案

Python需要在函数名称后加上括号,否则它将只求值其地址而不调用它们。在view.Executedb.Commit之后,您会丢失它们。

以上是关于[python win32使用Windows Installer API失败,但perl正常-我在python中做错了什么?的主要内容,如果未能解决你的问题,请参考以下文章

[python win32使用Windows Installer API失败,但perl正常-我在python中做错了什么?

Python 使用 win32com 模块对word文件进行操作

Configure Tomcat 7 to run Python CGI scripts in windows(Win7系统配置tomcat服务器,使用python进行cgi编程)

使用Python玩转WMI进行Win32api/com进行Windows编程开发

在windows7 64位 安装MySQL-python-1.2.5.win32-py2.7.exe

安装 pywin32-218.win32-py2.7.exe 报错python version 2.7 required,which was not found in the registry解决方案