1

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)を使用することです。

私はアンチウイルスを実行しておらず、署名プロセスを妨げる可能性のある他のことは考えられません。

4

1 に答える 1

0

間違った方向で犯人を探していたことが判明しました。

さらに調査した結果、ファイルをロックしているプロセスを特定できませんでした (スクリプト LockHunter から直接ハンドル ツールである Process Explorer を使用)。どうやら、Windows 8 に非常によく統合されているため、リアルタイム保護モジュールがバックグラウンドで実行されていることを完全に忘れることができます。実行可能ファイルが作成されるとすぐに、その後の署名の試みが失敗するのに十分な時間だけ、それがロックされることがあります。

私の最初の誤った推定についてお詫び申し上げます。

于 2013-03-29T16:49:21.267 に答える