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