首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在这种情况下,如何关闭MATLAB会话?

问在这种情况下,如何关闭MATLAB会话?
EN

Stack Overflow用户
提问于 2021-10-01 08:43:16
回答 2查看 161关注 0票数 0

我像这样使用Python的subprocess运行MATLAB。main.py如下:

代码语言:javascript
复制
process = subprocess.Popen("bash run.sh", stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
stdout = process.communicate()[0]

run.sh是这样的:

代码语言:javascript
复制
export PATH=...
/usr/local/MATLAB/R2017b/bin/matlab -r "run('mainscript.m');exit;"

在mainscript.m中,主要做的事情是。

问题是,当运行mainscript.m时出现一些错误时,process似乎被卡住了。而MATLAB程序不能正常退出。似乎MATLAB会话仍然在运行而没有退出,因此main.py仍然在没有退出的情况下运行,这似乎是卡住了。但实际上,main.py需要退出或发出一些警告。

所以我的问题是,当/usr/local/MATLAB/R2017b/bin/matlab -r "run('mainscript.m');exit;发生错误时,有没有办法退出MATLAB会话?

期待你的建议。谢谢。

更新:

在阅读了善意的评论和回答后,我提供了更多的细节来澄清这个问题。

main.py是:

代码语言:javascript
复制
import subprocess
import time
from threading import Thread


def main(param1):
    process = subprocess.Popen('bash run.sh', stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
    start = time.time()
    stdout = process.communicate()[0]
    elapsed = time.time() - start
    print('log: {}, {}, {}'.format(param1, stdout, elapsed))


if __name__=='__main__':
    _param = {"param1":"param1"}
    thread = Thread(target=main, kwargs=_param)
    thread.start()

run.sh是:

代码语言:javascript
复制
/usr/local/MATLAB/R2017b/bin/matlab -r "run('matlabscript.m');exit;"

matlabscript.m是(xxxx不是一个有效的函数/脚本,这会导致错误):

代码语言:javascript
复制
xxxx;

运行python main.py时,ps -u的输出如下:

代码语言:javascript
复制
ubuntu    4901  0.0  0.0 218624  5392 pts/4    Sl+  08:10   0:00 python main.py
ubuntu    4903  0.0  0.0 113280  1192 pts/4    S+   08:10   0:00 bash run.sh
ubuntu    4904  9.0  3.1 5702484 512812 pts/4  Sl+  08:10   0:06 /usr/local/MATLAB/R2017b/bin/glnxa64/MATLAB -r run('matlabscript.m');exit; -prefersoftwareopengl
ubuntu    5025  0.0  0.0 115544  2004 pts/3    Ss   08:11   0:00 -bash
ubuntu    5044  0.0  0.0 155436  1852 pts/3    R+   08:11   0:00 ps -u

而python main.py则是被卡在那里,没有退出正常状态。所以我是kill 4901,然后是ps -u,它显示:

代码语言:javascript
复制
ubuntu    4903  0.0  0.0 113280  1192 pts/4    S    08:10   0:00 bash run.sh
ubuntu    4904  4.7  3.1 5702484 512812 pts/4  Sl   08:10   0:06 /usr/local/MATLAB/R2017b/bin/glnxa64/MATLAB -r run('matlabscript.m');exit; -prefersoftwareopengl
ubuntu    5025  0.0  0.0 115544  2052 pts/3    Ss   08:11   0:00 -bash
ubuntu    5047  0.0  0.0 155436  1852 pts/3    R+   08:12   0:00 ps -u

这意味着MATLAB的子进程在没有退出的情况下仍在运行。

但是,下面是可以的。main_with_try_catch.py是:

代码语言:javascript
复制
import subprocess
import time
from threading import Thread


def main(param1):
    process = subprocess.Popen('bash run_with_try_catch.sh', stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
    start = time.time()
    stdout = process.communicate()[0]
    elapsed = time.time() - start
    print('log: {}, {}, {}'.format(param1, stdout, elapsed))


if __name__=='__main__':
    _param = {"param1":"param1"}
    thread = Thread(target=main, kwargs=_param)
    thread.start()

run_with_try_catch.sh是:

代码语言:javascript
复制
/usr/local/MATLAB/R2017b/bin/matlab -r "try,run('matlabscript.m'),catch,fprintf('error occured'),end;exit;"

然后,运行python main_with_try_catch.py,它显示:

代码语言:javascript
复制
[ubuntu@localhost ~]$ python main_with_try_catch.py
log: param1, MATLAB is selecting SOFTWARE OPENGL rendering.

                                                                              < M A T L A B (R) >
                                                                    Copyright 1984-2017 The MathWorks, Inc.
                                                                     R2017b (9.3.0.713579) 64-bit (glnxa64)
                                                                               September 14, 2017


To get started, type one of these: helpwin, helpdesk, or demo.
For product information, visit www.mathworks.com.

error occured, 7.47159695625
[ubuntu@localhost ~]$

这意味着MATLAB正常退出。检查ps -u,没有剩余的进程。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-01 13:17:21

不要在MATLAB的启动中使用-r来运行脚本。使用-batch选项代替。

-r选项说:“启动MATLAB并运行此脚本,完成后保持在命令提示符下”。脚本用于初始化环境。这就是为什么您的脚本需要以exit结尾,而不是错误退出,如果您想非交互地运行它。

-batch选项表示“运行此脚本,然后以成功/失败状态退出MATLAB”。它是指非交互地执行用MATLAB语言编写的脚本.它不显示启动屏幕,也不加载GUI,通过stdout和stderr生成输出。见医生们。此选项自R2019a以来就存在。

票数 3
EN

Stack Overflow用户

发布于 2021-10-01 10:19:01

在线程中运行subprocess,如果未正常退出,则在给定超时后终止它。在这里找到示例:https://stackoverflow.com/a/4825933/4620675

若要关闭进程,只需在子进程中使用普通的kill:kill -TERM $(pgrep -f matlab)

或使用方法:

代码语言:javascript
复制
    import os
    import signal
    def find_process_and_close(process_name):
        output = subprocess.getoutput("ps -A -o pid= -o cmd=")
        for line in output.splitlines():
            if process_name in line:
                pid = int(line.split()[0])
                os.kill(pid, signal.SIGTERM)
                print("Terminate process {}".format(line))
                return True
        return False

另一种使用psutil包的方法:

代码语言:javascript
复制
    import psutil
    def find_process_and_close_with_psutil(process_name):
        for proc in psutil.process_iter(['pid', 'name', 'cmdline']):
            if proc.info['cmdline'] and process_name in proc.info['cmdline']:
                print("Terminate process {}".format(proc.info))
                proc.kill()
                return True
        return False

在阅读评论后编辑。您可以连续读取脚本的输出,如果发现有趣的字符串,例如“错误”消息,只需终止正在运行的进程(与所有子进程一起):

代码语言:javascript
复制
    proc = subprocess.Popen(["bash run.sh"],
                            preexec_fn=os.setsid, # to kill all spawned processes
                            stdout=subprocess.PIPE,
                            stderr=subprocess.STDOUT)
    pid_to_terminate = None
    try:
        for stdout_line in iter(proc.stdout.readline, ''):
            line = stdout_line.decode().strip()
            print(line)
            #look for 'error' in the output
            if "error" in line:
                print("ERROR found in script output")
                pid_to_terminate = proc.pid
                break
    finally:
        proc.stdout.close()
    
    if pid_to_terminate:
        # kill with all spawned processes
        os.killpg(os.getpgid(pid_to_terminate), signal.SIGTERM)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69402993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档