如何编写一个prolog程序来控制另一个命令行程序?

如何编写一个prolog程序来控制另一个命令行程序?,prolog,swi-prolog,Prolog,Swi Prolog,我想学习如何编写一个prolog程序来控制另一个命令行程序 作为一个具体的例子,我想控制mps youtube()。 首先,我需要有某种循环来读取屏幕上的菜单,并能够输入命令来控制程序。这是我到目前为止写的: youtube :- setup_call_cleanup( process_create(path(mpsyt), [], [ stdout(pipe(Out)),stdin(pipe(In))

我想学习如何编写一个prolog程序来控制另一个命令行程序

作为一个具体的例子,我想控制mps youtube()。 首先,我需要有某种循环来读取屏幕上的菜单,并能够输入命令来控制程序。这是我到目前为止写的:

youtube :-
    setup_call_cleanup(
        process_create(path(mpsyt), [],
                       [ stdout(pipe(Out)),stdin(pipe(In))
                       ]),
        (   read_lines(Out, Lines),
            maplist(writeln,Lines),
        my_command_loop(In,Out)),
        close(Out)).


read_lines(Out, Lines) :-
        read_line_to_codes(Out, Line1),
        read_lines(Line1, Out, Lines).

read_lines(end_of_file, _, []) :- !.
read_lines(Codes, Out, [Line|Lines]) :-
        atom_codes(Line, Codes),
        read_line_to_codes(Out, Line2),
        read_lines(Line2, Out, Lines).



my_command_loop(In,Out):-
    writeln("Enter a command:"),
    read(command(Command)),
    dif(Command,stop),
    writeln(Command),
    writeln(In,Command),
    read_lines(Out,Lines),
    maplist(writeln,Lines),
    my_command_loop(In,Out).

my_command_loop(_,_):-
    true.
我的想法是,我将与此交互,例如输入
command('/oasis')
,然后输入
command(1)。
最后输入
command(stop)。

如果我尝试运行此命令,会出现以下错误:

Traceback (most recent call last):
  File "/usr/bin/mpsyt", line 9, in <module>
    load_entry_point('mps-youtube==0.2.5', 'console_scripts', 'mpsyt')()
  File "/usr/lib/python3/dist-packages/mps_youtube/main.py", line 4696, in main
    set_window_title("mpsyt")
  File "/usr/lib/python3/dist-packages/mps_youtube/main.py", line 152, in set_window_title
    sys.stdout.write(xenc('\x1b]2;' + title + '\x07'))
TypeError: write() argument must be str, not bytes
回溯(最近一次呼叫最后一次):
文件“/usr/bin/mpsyt”,第9行,在
加载入口点(“mps-youtube==0.2.5”,“控制台脚本”,“mpsyt”)()
文件“/usr/lib/python3/dist packages/mps_youtube/main.py”,第4696行,在main中
设置窗口标题(“mpsyt”)
文件“/usr/lib/python3/dist packages/mps\u youtube/main.py”,第152行,在集合窗口标题中
sys.stdout.write(xenc('\x1b]2;'+title+'\x07'))
TypeError:write()参数必须是str,而不是bytes

这似乎表明python程序mps youtube在创建过程中没有正确加载。这个想法可能吗?实现这一点的好方法是什么?

我不知道还有什么,我觉得很像是调用了错误的Python版本。嗯,我想知道你是如何检查/更改它的。试着从命令行运行
mpsyt
?这很好。当Prolog运行时,环境可能会有所不同;尝试在命令行上执行
env
,而不是从Prolog执行。