Windows 8、Python 3.3で実行すると、次々に実行される3つのプロセスが生成されます。最初に実行可能ファイルに署名し、次にInno Setupを使用してキットを構築し(最初のステップの実行可能ファイルが含まれます)、最後に署名するための2番目のステップからの出力。しかし、時間の経過とともに、署名ツールが実行可能ファイルに署名できないと文句を言う競合状態のように見えます。2番目のプロセスはファイルハンドル(またはOS)を何らかの形で解放しないようです...エラーコードを検索した後、実行する必要があります(これを確認するためにprocess.communicate()を使用しています) 。また、time.sleep()を使用すると問題が解決するようであるため、競合状態が疑われます。
2番目のプロセスが何らかの形でそれ自体を切り離してバックグラウンドで実行される可能性はありますか?しかし、もしそうなら、どうして私はログファイルに正しくログインしている操作を常に見ることができるのですか(例えば、最初の歌の出力、ビルド、2番目の署名(成功したか失敗したかに関係なく))?通信から出力を取得するという事実は、すべてのリソース(ファイルハンドルを含む)が解放されたことを意味するのではないでしょうか?コードは次のとおりです。
def do_build():
'''
Prepare the kit.
'''
global kit_file
kit_file = ''.join([OUTPUT_FILENAME, '_', version]) # do not add '.exe', as Inno does it during build
DESCR = 'Execute Build'
logf.write(BEGIN + DESCR + SEP2)
def run_command(c, ex):
with subprocess.Popen(c, stdout = subprocess.PIPE, stderr = subprocess.PIPE, executable = ex) as proc:
stdout_data, stderr_data = proc.communicate()
logf.write(str(stdout_data, 'cp1252'))
if proc.returncode != 0: # log errors if needed
logf.write(str(stderr_data, 'cp1252'))
sys.exit()
sign_exe = [SIGNCODE, '-cn', TTT, '-n', KIT_TYPE2.upper(), '-i', URL, '-t', TSURL]
sign_kit = sign_exe[:] # make copy
sign_exe.append(os.sep.join([PDIR, DEPLOYMENT, EXECUTABLE])) # sign the executable
run_command(sign_exe, os.sep.join([PDIR, SIGNCODE]))
compile = [ISCC, ''.join(['/O', OUTPUT_DIR]), ''.join(['/F', kit_file]), os.sep.join([PDIR, ISS_FILE])] # compile using the ISS script
run_command(compile, os.sep.join([ISSC_PATH, ISCC]))
# time.sleep(something) here seems to save the day...
sign_kit.append(os.sep.join([PDIR, ''.join([kit_file, '.exe'])])) # sign the kit, don't forget '.exe'
run_command(sign_kit, os.sep.join([PDIR, SIGNCODE]))
logf.write(END + DESCR + SEP2)
私はInnoSetup5、コマンドラインツール、iscc.exe、FWIWを使用しています。
この動作の説明はありますか?私が見る唯一の回避策は、最後の署名を試みる前にos.access(file、os.W_OK)を使用することです。
私はアンチウイルスを実行しておらず、署名プロセスを妨げる可能性のある他のことは考えられません。