[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.Execute
和db.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解决方案