在Python中与Rar.exe通信

时间:2013-02-16 17:59:52

标签: python subprocess interactive rar pexpect

从Python脚本我想创建一个RAR文件。我需要与Rar.exe进行通信,因为我只需要来自多卷存档集的第一个RAR卷,仅此而已。 -vp开关确保在每个卷后询问Create next volume ? [Y]es, [N]o, [A]ll。第一次弹出这个问题时,我想回答否。我该如何做到这一点?

我一直在阅读和尝试很多事情,我发现pexpect可以完成这样的事情。我一直在尝试两个不同的Windows端口:wexpectwinpexpect。结果是我的脚本将挂起。没有创建RAR文件。这是我的代码:

import wexpect
import sys

rarexe = "C:\Program Files\WinRAR\Rar.exe"
args = ['a', '-vp', '-v2000000b', 'only_first.rar', 'a_big_file.ext']

child = wexpect.spawn(rarexe, args)
child.logfile = sys.stdout
index = child.expect(["Create next volume ? [Y]es, [N]o, [A]ll", 
        wexpect.EOF, wexpect.TIMEOUT], timeout=10)
if index == 0:
     child.sendline("N")
else:
     print 'error'

其他方法也是受欢迎的。

2 个答案:

答案 0 :(得分:0)

我的问题的答案分为两个部分。

正如betontalpfa所说,我必须使用他的version of wexpect。它可以轻松安装:

pip install wexpect

Pexpectexpect_exact文档解释说,它使用纯字符串匹配而不是列表中的已编译正则表达式模式。这意味着必须正确地转义参数,或者必须使用expect_exact方法代替expect。它给了我这个工作代码:

import wexpect
import sys

rarexe = "C:\Program Files\WinRAR\Rar.exe"
args = ['a', '-vp', '-v2000000b', 'only_first.rar', 'a_big_file.ext']

child = wexpect.spawn(rarexe, args)
# child.logfile = sys.stdout
rar_prompts = [
        "Create next volume \? \[Y\]es, \[N\]o, \[A\]ll",
        "\[Y\]es, \[N\]o, \[A\]ll, n\[E\]ver, \[R\]ename, \[Q\]uit",
        wexpect.EOF, wexpect.TIMEOUT]
index = child.expect(rar_prompts, timeout=8)

while index < 2:
        # print(child.before)
        if index == 0:
                print("No next volume")
                child.sendline("N")
        elif index == 1:
                print("Overwriting existing volume")
                child.sendline("Y")
        index = child.expect(rar_prompts, timeout=8)
else:
        print('Index: %d' % index)
        if index == 2:
                print("Success!")
        else:
                print("Time out!")

输出结果为:

Overwriting existing volume
No next volume
Index: 2
Success!

答案 1 :(得分:-1)

我遇到了同样的问题,因为网络上有多个(越野车)的wexpect版本。

检出my variant,它是实例的副本,对我有用。

可以使用

安装

pip install wexpect