首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >捕获Python中sendpraat命令产生的Praat错误消息

捕获Python中sendpraat命令产生的Praat错误消息
EN

Stack Overflow用户
提问于 2015-09-04 21:21:55
回答 1查看 699关注 0票数 0

您可以启动Praat实例,然后使用sendpraat.exe向其发送GUI命令。因此,如果您在后台运行了Praat,下面的命令将导致它作为声音对象在本地mysound.wav文件中读取:

代码语言:javascript
复制
sendpraat praat "Read from file... mysound.wav"

有很多方法可以通过Python发送这个命令,例如:

代码语言:javascript
复制
import subprocess
subprocess.call('sendpraat praat "Read from file... mysound.wav"')

但是如果mysound.wav不存在,普拉特实例将弹出一个包含错误的消息框。如何在Python中捕获此错误消息的内容并避免弹出?

这些解决方案不适用于这个问题:

  1. 对于这个特殊的例子,如果文件存在,我可以签入Python。但是,我还需要处理Praat将抛出的所有其他错误,例如当它在编码方面有问题时,或者当样本被裁剪时。
  2. 我可以在命令之前使用nocheck (sendpraat praat nocheck "Read from file... mysound.wav"以避免弹出),但是Python无法知道命令失败。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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中,但您了解到了这一点):

代码语言:javascript
复制
#!/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的含量

代码语言:javascript
复制
abc$ = "abcde"
num$ = "0123456789"
writeInfoLine: abc$
assert selected("Sound")  ; Fail
writeInfoLine: abc$, num$ ; Won't run

产出:

代码语言:javascript
复制
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的尝试/捕获程序版本。有了它,像这样的剧本

代码语言:javascript
复制
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分发的实用程序插件中可用,并实现了这里

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32406768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档