我有一个Python脚本,该脚本使用subprocess.check_call启动Wine(Linux上的Windows Emulator),然后wine启动Z:\\Program Files (x86)\\PeaZip\\peazip.exe

首先,当我在调试模式python3 -u -m ipdb unpack_archive.py下测试此python脚本,并逐步围绕wine启动和运行语句设置断点时,Wine成功运行peazip.exe。也就是说,peazip在Linux上成功提取了PEA存档。

但是,当我不在调试模式python3 unpack_archive.py下测试此python脚本时,我发现peazip.exe无法成功提取PEA存档。所以我怀疑wine或python subprocess.check_call()中存在同步问题。

现在我的解决方法是,在启动wine之后插入time.sleep(1.0)

elif 'PEA archive' in ftype:
    if splitext(arcname)[1] != '.pea':
        tmpfile = os.path.join(tmpdir, basename(arcname))+'.pea'
    else:
        tmpfile = os.path.join(tmpdir, basename(arcname))
    shutil.copy(arcname, tmpfile)
    subprocess.check_call(["wine", "/home/acteam/.wine/drive_c/Program Files (x86)/PeaZip/peazip.exe",
        "-ext2here", to_wine_path(tmpfile)])
    import time
    time.sleep(1.0) # if we don't sleep, then peazip.exe won't extract file successfully
    os.remove(tmpfile)
    copy_without_symlink(tmpdir, outdir)


我检查了wine manual,它没有提及任何有关同步的内容。我还检查了subprocess.check_call()。该文档明确表示check_call()将等待命令完成。

我不需要这种解决方法,因为如果PEA存档文件非常大,则sleep()的超时值必须更大,并且在运行它之前我们无法预测足够的超时值。



我提到了@jasonharper的建议。使用subprocess.check_output()代替check_call()

    elif 'PEA archive' in ftype:
        if splitext(arcname)[1] != '.pea':
            tmpfile = os.path.join(tmpdir, basename(arcname))+'.pea'
        else:
            tmpfile = os.path.join(tmpdir, basename(arcname))
        shutil.copy(arcname, tmpfile)
        subprocess.check_output(["wine", "/home/acteam/.wine/drive_c/Program Files (x86)/PeaZip/peazip.exe",
            "-ext2here", to_wine_path(tmpfile)])
        os.remove(tmpfile)
        copy_without_symlink(splitext(tmpfile)[0], outdir)


我用python3 unpack_archive.py Kevin.pea(2.0GB PEA存档)进行了测试。提取过程需要4分16秒。三个子文件已成功解压缩。

最佳答案

我的理解是wine可执行文件不是真正的模拟器-如果尚未运行,它会启动一个名为wineserver的后台进程,告诉它运行Windows程序,然后立即退出自身-很有可能在Windows之前程序甚至开始运行。

this question的答案之一表明,将wine的输出传递到另一个程序将延迟事情直到Windows程序实际退出。用Python术语,这等效于使用check_output()而不是check_call(),尽管我自己没有尝试过。

关于python - Python subprocess.check_call([“wine”] ..)出现同步问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45635565/

10-11 19:52