我正在尝试从脚本运行windows helpfile编译器(hhc.exe
),但它显示出非常意外的行为。
当我从带有hhc pathtohelpproject.hpp
的cmd.exe运行它时,将按预期编译帮助文件。但是,从具有相同工作目录的python调用完全相同的命令会导致程序返回0并且没有输出。
但它变得更奇怪:我已经创建了一个批处理文件runhhc.bat
:
hhc "pathtohelpproject.hpp"
我通过调用call runhhc.bat
,start runhhc.bat
和runhhc.bat
从python脚本运行。
所有这些都导致了相同的行为。但是,使用start runhhc.bat
cmd实例在hhc返回后仍然打开,所以我尝试再次手动输入命令,但没有成功。但是当我用新手动打开的cmd进入命令时,它也没有用!实际上,只有在我关闭由我的脚本打开的cmd后它才开始工作。
这种离奇行为的解释是什么?我怎样才能从脚本运行编译器?
答案 0 :(得分:0)
完全归结为hhc.exe,没有别的。诀窍是在运行后查看%ERRORLEVEL%。它返回" 1"尽管成功了。如果hhc.exe运行与其他东西隔离,这可以在自定义命令中用于警告用户它是虚假的。 HHC.exe正在使用HHA.dll。关于HHA.dll信息尚未发布。 Microsoft根据保密协议(NDA)将HHA接口信息授予已批准的帮助ISV。
D:\_working>"C:\Program Files (x86)\HTML Help Workshop\hhc" foobar.hhp
Microsoft HTML Help Compiler 4.74.8702
Compiling d:\_working\foobar.chm
...
Compile time: 0 minutes, 1 second
22 Topics
87 Local links
2 Internet links
0 Graphics
Created d:\_working\foobar.chm, 305,338 bytes
Compression decreased file by 53,639 bytes.
D:\_working>echo %errorlevel%
1
要解决此问题并继续,您需要在批处理文件中添加if not %errorlevel% 1 exit /B 1
。
@echo off
REM -----------------------------------------
REM batch file is located in D:\_batch
REM HH project file is located in D:\_working
REM -----------------------------------------
cd ..\_working
echo '//--- HH Compiler start --------------------------------------
"C:\Program Files (x86)\HTML Help Workshop\hhc" foobar.hhp
echo '//--- HH Compiler end --------------------------------------
echo '//--- errorlevel -------------------------------------------
echo %errorlevel%
echo '//------------------------------------------------------------
if not %errorlevel% 1 exit /B 1
调用此批处理的python脚本:
print ("*******************************")
print ("We compile a CHM help file ...")
print ("*******************************")
# First import the 'ctypes' module. ctypes module provides C compatible data types and allows calling functions in DLLs or shared libraries.
import ctypes # An included library with Python install.
# ctypes.windll.user32.MessageBoxW(0, "Open CHM", "Your title", 1) # OK only
messageBox = ctypes.windll.user32.MessageBoxA
# documentation: https://msdn.microsoft.com/en-us/library/windows/desktop/ms645505(v=vs.85).aspx
returnValue = messageBox(None,"Compile Help Module (CHM) now?","CHM and Python",1) # 1=OK Cancel, 2=Cancel, Retry, Ignore
if returnValue == 1:
print("Pressed OK")
# How to compile a chm file in Python?
# ---------------------------------
import os
os.system("D:/_batch/run-hhc.bat")
elif returnValue == 2:
print("user pressed cancel button!")
您可能有兴趣从python脚本调用CHM:
# How to open a chm file in Python?
# ---------------------------------
# os.system("hh.exe D:/UserData-QGIS-Python/Projekte/ConnectChm/CHM-example.chm")
import os
os.system("hh.exe D:/UserData-QGIS-Python/Projekte/ConnectChm/CHM-example.chm::/garden/garden.htm")