2016-08-25 13 views
0

スクリプトからWindowsヘルプファイルコンパイラ(hhc.exe)を実行しようとしていますが、HTMLHelpコンパイラはコマンドラインから完全に動作しますが、スクリプトまたはバッチファイルからは実行されません。

hhc pathtohelpproject.hppでcmd.exeを実行すると、ヘルプファイルが期待通りにコンパイルされます。しかし、同じ作業ディレクトリを持つPythonから全く同じコマンドを呼び出すと、プログラムは0を返し、出力は返されません。

しかし、それはもっと奇妙な取得します。

hhc "pathtohelpproject.hpp" 

私はcall runhhc.batstart runhhc.batだけrunhhc.batを呼び出すことによって、Pythonスクリプトから走った:私は、バッチファイルrunhhc.batを作成しました。

これらのすべてが同じ結果になりました。しかし、start runhhc.batでは、hhcが返された後でもcmdインスタンスが開いていたので、コマンドを手動で再度入力しようとしましたが、成功しませんでした。しかし、新しく手動で開いたcmdでコマンドを入力したときにも、動作しませんでした。実際には、スクリプトで開かれたcmdを閉じた後にのみ動作し始めました。

この奇妙な行動の説明は何でしょうか?また、どのようにしてスクリプトからコンパイラを実行することができますか?

+0

は 'hhc'ですバッチファイル?もしそうならバッチファイルから 'call'を実行する必要があります。とにかく 'hhc'と' * .hpp'ファイルへのフルパスを指定してください... – aschipfl

+0

hhcは実行可能ファイルです。私は両方の完全なパスと相対パスの両方を試しましたが、結果は同じです! – Lukas

+0

孤立した 'start'コンソールでは、手動で開く通常のコンソールとは違うものを見つけようとします。たとえば、環境を表示して出力を比較するために' set'を実行するなどして、それぞれをファイルにリダイレクトして比較することができます'comp'と一緒に)。 – wOxxOm

答えて

0

これはhhc.exeに全く無責任です。トリックは、実行後に%ERRORLEVEL%を見ることです。成功しても "1"を返します。これは、hhc.exeの実行が他のものから分離されている場合、それが偽のものであることをユーザに警告するカスタムコマンドで使用できます。 HHC.exeはHHA.dllを使用しています。 HHA.dllについての情報は公開されていません。マイクロソフトは、非公開契約(NDA)の下で承認されたヘルプISVにHHAインターフェイス情報を付与します。この周りを移動し、バッチファイルでif not %errorlevel% 1 exit /B 1を追加する必要があります続行するに

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 

@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!") 

enter image description here

あなたは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") 
+0

詳細な回答ありがとうございましたが、実際の質問を逃したと思います(恐らくそれほど尋ねなかったでしょうか?)。私はhhc.exeがネストされたシェルから実行されているとコンパイルを拒否したことを知りました。(別名、Pythonスクリプトはシェルから実行され、shell = Trueのサブプロセスを呼び出すので、バッチファイルは別のシェル再び)。だから私は私の問題を回避するためにpythonw.exeを使用して私のスクリプトを実行したので、サブプロセス呼び出しが最初のシェルになります。その後、hhc.exeはまったく同じコマンドで完璧に動作します。 – Lukas

関連する問題