【问题标题】:How to execute a system command and display its state in the Text Widget table如何执行系统命令并在 Text Widget 表中显示其状态
【发布时间】:2014-06-20 03:31:53
【问题描述】:

我尝试使用来自 CPAN Tk::ExecuteCommand 模块的 sn-p 来实现上述目标,但是当我在 $ec->configure(-command 部分中执行任何 Perl 程序时,它会在下面给出错误。

此外,一旦 Perl 作业完成,窗口将意外关闭。如果我只在条目中打印文本而不是命令(正如我注释掉的行),脚本可以工作并且不会关闭。我选择使用这个 Cpan 程序是因为我想要两件事:

  1. 在文本小部件中显示系统命令和运行结果。
  2. 在作业运行时让“执行按钮”变为“取消”,以便用户有机会取消正在进行的作业。
    我可以知道如何实现吗?

这是我得到的错误消息:

 > /usr/bin/perl: symbol lookup error: /usr/pkgs/perl/5.14.1/lib64/module/default/x86_64-linux/auto/Proc/ProcessTable/ProcessTable.so: undefined symbol: pthread_once

[13] 退出 127 test1.pl

这是我使用的代码:

#!/usr/bin/perl

use Tk;
use Tk::ExecuteCommand;

$ec = tkinit()->ExecuteCommand(
     -command    => '',
     -entryWidth => 50,
     -height     => 10,
     -label      => '',
     -text       => 'Execute',
)->pack;
$ec->configure(-command => 'perl ./my_script.pl -wrapper wrapper_txt');
#$ec->configure(-command => 'Text line only');
$ec->execute_command;
$ec->update;

MainLoop;

【问题讨论】:

    标签: perl perltk


    【解决方案1】:

    $ec->configure(-command => 'perl ./my_script.pl -wrapper wrapper_txt'); 更改为$ec->configure(-command => 'perl my_script.pl -wrapper wrapper_txt');

    要获得状态,请使用如下所示的子

    sub sys {
    
        # Execute a command asynchronously and return its status and output.
    
        my $cmd = shift;
    
        $ec->configure( -command => $cmd );
        my $t = $ec->Subwidget( 'text' ); # ROText widget
        $t->delete( '1.0' => 'end' );
        $ec->execute_command;
        return ($ec->get_status)[0], split /\n/, $t->get( '1.0' => 'end -1 chars' );
    
    } # end sys
    

    要使用按钮杀死它,请查看文档,它说

    这个 ExecuteCommand 巨型小部件由 LabEntry 小部件组成,用于 命令条目,启动命令执行的“执行”按钮,以及 收集命令执行输出的 ROText 小部件。虽然 命令正在执行,“执行”按钮变为“取消”按钮 这可能会过早地终止正在执行的命令。 kill_command 方法以编程方式做同样的事情。

    所以你需要$exec->execute_command; $exec->get_status;$exec->kill_command;

    编辑:看起来像known issue,尝试使用最新版本的 Proc::ProcessTable。

    另见:Bug #41397 for Proc-ProcessTable: Proc::ProcessTable - make test fails "undefined symbol: pthread_once"

    【讨论】:

    • 嗨 Chankey,感谢您的回复。使用我上面发布的代码,它们实际上可以工作,但是一旦 perl 命令运行完成,它就会中止(我在文本小部件中看到了结果提示,但此后窗口立即关闭)。在我调用脚本的 Unix 提示符下,它显示错误“符号查找错误:/usr/pkgs/perl/5.14.1/lib64/module/default/x86_64-linux/auto/Proc/ProcessTable/ProcessTable.so: undefined符号:pthread_once”。建议的解决方案似乎对我不起作用:(。
    • 然后好像有些库不见了。您使用的是最新版本的Proc::ProcessTable 吗?看到这个:blogs.perl.org/users/gabor_szabo/2012/09/…
    • 我实际上不确定如何检查它,我想当我调用“use Tk::ExecuteCommand”时应该包括它对吗?我的 Perl 版本是 v5.14.1。
    • perl -MProc::ProcessTable -e 'print $MODULE::VERSION';最新版本为0.50 metacpan.org/pod/Proc::ProcessTable
    • 我已包含“使用 Proc::ProcessTable;”但似乎仍在抱怨同样的错误。你能解释一下这个错误是什么意思吗?想知道上面的代码是否适用于您?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 2011-03-12
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    相关资源
    最近更新 更多