我有一个python脚本,它使用
subprocess.check_call
Z:\\Program Files (x86)\\PeaZip\\peazip.exe
.
首先,当我在调试模式下测试这个python脚本时
python3 -u -m ipdb unpack_archive.py
peazip.exe
成功地也就是说,peazip在Linux上成功地提取了PEA存档。
然而,当我在调试模式下测试这个python脚本时
python3 unpack_archive.py
,然后我找到了peazip。exe无法成功提取PEA存档。所以我怀疑wine或python子进程中存在同步问题。check_call()。
现在我的解决方法是插入
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\u call()将等待命令完成。
我不想要这种解决方法,因为如果PEA归档文件非常大,那么sleep()的超时值必须更大,并且在运行它之前我们无法预测足够的超时值。
我提到
@jasonharper
的建议。使用子流程。check\u output()而不是check\u 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秒。三个子文件成功解包。