Lisp与外部流程沟通

时间:2017-10-27 18:19:11

标签: lisp autocad autolisp

我想要做的是让AutoLISP程序调用可执行文件并从该可执行文件中获取响应。

据我所知,我们目前可以使用startapp调用应用程序,例如

(startapp "notepad.exe" "acad.lsp")

但据我了解,我不相信startapp可以从被叫应用程序返回值。

在上下文中,我希望能够从lisp调用一个应用程序,当该应用程序关闭时,将状态代码发送回lisp,以允许它继续执行。

in fake lisp code

(
    (startapp "myapp.exe" "args")
    (*DO UNTIL STATUS CODE == 1* or *"myapp.exe is stopped*
        *CODE*
    )
    *CONTINUE EXECUTION
)

如果在LISP中有可能出现这种性质,或者有更好的方法来查看流程是否已在LISP中结束,那么任何方向都将受到赞赏。

1 个答案:

答案 0 :(得分:2)

运行外部应用程序并等到完成过程您可以这样做:

sudo du -h -d 2 /var/lib/docker

易于运行,但无法轻松访问返回值。

或者你可以这样做

(command "_Shell" (strcat path app ) )

现在,如果你的应用程序返回状态,你就拥有它。

如果您的应用程序操作Acad环境您可以按系统变量(defun Sleep (n / lastCmdecho ) (setq lastCmdecho (getvar "cmdecho")) (setvar "cmdecho" 0) (eval (list 'VL-CMDF "_.delay" n ) ) (setvar "cmdecho" lastCmdecho ) ) (defun C:ExternalApplication ( / *error* ) (defun *error* ( msg / ) (if (not (null msg ) ) (progn (princ "\nC:ExternalApplication:*error*: " ) (princ msg ) (princ "\n") ) ) ) (setq path "C:\\Windows\\") (setq app (strcat "Notepad.exe" ) ) (print (strcat "Run " (strcat path app ) ) ) (setq Shell (vlax-get-or-create-object "Wscript.Shell")) (setq AppHandle(vlax-invoke-method Shell 'Exec (strcat path app ) )) (while ( = (vlax-get-property AppHandle 'Status ) 0) (Sleep 1000) )` (vlax-release-object Shell) (print "Process finished" ) ) 或环境变量(setvar)设置值。

如果没有,您可以将值保存到系统注册表并通过以下方式读取它:(setenv)