在 SWI Prolog 中使用 process_create/3 使用命令提示符或 shell 时出错

Posted

技术标签:

【中文标题】在 SWI Prolog 中使用 process_create/3 使用命令提示符或 shell 时出错【英文标题】:Error while using command prompt or shell using process_create/3 in SWI Prolog 【发布时间】:2016-07-01 11:35:32 【问题描述】:

在 Windows 7 上,当我在 SWI Prolog 中使用 process_create/3 打开像 Notepad.exe 这样的应用程序时,记事本会打开。但是,它不适用于使用命令提示符的应用程序。例如,当我尝试打开命令提示符窗口时,使用:

main :- process_create('C:\\WINDOWS\\system32\\cmd.exe',[] ,[]).

给出一个

ERROR: Process "c:\windows\system32\cmd.exe": exit status: 1

同样,当尝试打开 powershell.exe 时,它​​也不起作用。控制台只是挂起,没有显示错误。

非常感谢任何帮助。

【问题讨论】:

您是否需要启动应用程序以便开始使用它而不是当前运行的 Prolog 程序?如果没有其他参数,process_create/3 用于运行一次非交互式程序。如果您想切换焦点,您可能需要仔细阅读可以传递给process_create/3 的所有选项。 从我的 Prolog 代码中,我正在尝试启动应用程序,它是一个 .bat,它启动命令提示符窗口并开始在其中运行。您需要将参数传递给它。现在我可以使用win_exec/2 从我的代码运行应用程序,它也可以工作(包括向它传递参数)。但我想使用process_create/3 将参数传递给它来运行它,方法是将它们传递到Args 列表中,如文档中所述。但是,它不起作用。所以我尝试打开 Notepad.exe 和 cmd.exe 看看它是如何工作的,如上所述。关于如何使其工作的任何想法?谢谢。 暂时你最好使用win_exec/2。我不使用 Windows,所以我能帮您做的最好的事情就是比您更仔细地阅读文档;)但对于 Windows,process_create/3 似乎不如win_exec/2 有用。不过不要相信我的话。 【参考方案1】:

要启动一个单独的控制台窗口:

?- process_create(path(cmd), ['/c', 'start', 'cmd'], []).

甚至更短(但我不知道它的便携性如何):

?- process_create(path(cmd), ['/c', 'start'], []).

或者这样(想法取自 SWI-Prolog 源代码):

?- getenv('COMSPEC', CMD), process_create(CMD, ['/c', 'start'], []).

使用 3 个参数启动外部 BAT 命令:

?- process_create(
    path(cmd), 
    ['/c', 'start', 'cmd', '/c', 'c:\\test\\test.bat', 'arg1', 'arg2', 'arg3'],
    []).

重要提示:理论上您可以将所有这些参数作为一个字符串传递,例如。 '/c start cmd ...' 而不是字符串列表,但在更复杂的情况下可能会发生奇怪的事情。就我而言,SWI-Prolog 7.2.3 在末尾添加了单引号或单双引号,因此传递给批处理脚本的最后一个参数不是arg3,而是arg3'arg3"

【讨论】:

以上是关于在 SWI Prolog 中使用 process_create/3 使用命令提示符或 shell 时出错的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在Swi-Prolog中获得以毫秒为单位的经过时间?

同时应用谓词来过滤列表(SWI Prolog)

SWI Prolog与GNU Prolog - SWI下的CLP(FD)问题

使用 SWI 序言

在 Swi-prolog 中增加运行时的堆栈大小

如何在 SWI-Prolog 上设置闹钟?