您可以启动Praat实例,然后使用sendpraat.exe向其发送GUI命令。因此,如果您在后台运行了Praat,下面的命令将导致它作为声音对象在本地mysound.wav文件中读取:
sendpraat praat "Read from file... mysound.wav"有很多方法可以通过Python发送这个命令,例如:
import subprocess
subprocess.call('sendpraat praat "Read from file... mysound.wav"')但是如果mysound.wav不存在,普拉特实例将弹出一个包含错误的消息框。如何在Python中捕获此错误消息的内容并避免弹出?
这些解决方案不适用于这个问题:
nocheck (sendpraat praat nocheck "Read from file... mysound.wav"以避免弹出),但是Python无法知道命令失败。发布于 2015-09-05 10:41:18
nocheck是普拉特进行错误处理的唯一方法,尽管它可能是有限的。如果您想从Python (或任何其他类似的)中以编程方式使用GUI,那么进行错误处理的最佳方法是使用nocheck,然后通过查找这些命令的副作用来捕获错误。
如果您正在打开一个Sound,您可以执行assert numberOfSelected("Sound")或类似的操作(有多少优雅的测试)。如果要将某些内容写入磁盘,则可以使用fileReadable()查看文件是否已创建。
或者,如果您没有实际使用GUI,则可以完全绕过sendpraat并通过控制台使用普拉特(在6.0之前的版本中,Windows需要不同的名为praatcon的二进制文件,但是最近的版本使用相同的程序和--run选项)。
您将无法将命令直接传递给它,但是您可以将这些命令封装到脚本中,然后只执行subprocess.call('praat --run path/to/my/script.praat arguments')之类的操作。然后,您可以使用Python捕获该脚本(=您的命令)中的错误,或者实现与上面相同的手动错误检查。
更新:一个例子
下面是一个示例(在Perl和Linux中,但您了解到了这一点):
#!/usr/bin/env perl
use Capture::Tiny ':all';
use Try::Tiny;
try {
($stdout, $stderr, $exit) = capture {
system( 'praat', '--run', '~/stdout.praat' );
}
}
catch {
chomp;
warn "It died: $_";
};
print "STDOUT:\n$stdout\n";
print "STDERR:\n$stderr";以及stdout.praat的含量
abc$ = "abcde"
num$ = "0123456789"
writeInfoLine: abc$
assert selected("Sound") ; Fail
writeInfoLine: abc$, num$ ; Won't run产出:
user@linux:~$ perl stdout.pl
STDOUT:
abcde
STDERR:
Error: No Sound selected.
Formula not run.
Script line 4 not performed or completed:
« assert selected("Sound") ; Fail »
Script “/home/user/stdout.praat” not completed.
Praat: command file “/home/user/stdout.praat” not completed.更新:在普拉特尝试/捕捉
自从我写了这个答案之后,我成功地实现了一个非常基本的Praat的尝试/捕获程序版本。有了它,像这样的剧本
include path/to/try.proc
writeInfoLine: "Before fail"
call try
... abc$ = "abcde" \n
... num$ = "0123456789" \n
... Create Sound as pure tone: "tone", \n
... ... 1, 0, 0.4, 44100, 440, 0.2, 0.01, 0.01 \n
... assert selected("TextGrid") ; Fail \n
... Remove ; Won't run \n
if try.catch
appendInfoLine: "Failed!"
endif将在不崩溃的情况下执行,留下创建的声音,因为删除它的行没有运行。
该过程在通过CPrAN分发的实用程序插件中可用,并实现了这里。
https://stackoverflow.com/questions/32406768
复制相似问题