Python Can';t在页眉中同时导入os.system和matlab.engine
我想启动一个共享的matlab会话,然后用相同的python 3脚本立即连接到它。我还希望在脚本完成后保持matlab会话打开。因为在将来,我想编写一个类来实现这一点,我想导入头中的所有库 问题是,如果我导入Python Can';t在页眉中同时导入os.system和matlab.engine,python,python-3.x,matlab,subprocess,matlab-engine,Python,Python 3.x,Matlab,Subprocess,Matlab Engine,我想启动一个共享的matlab会话,然后用相同的python 3脚本立即连接到它。我还希望在脚本完成后保持matlab会话打开。因为在将来,我想编写一个类来实现这一点,我想导入头中的所有库 问题是,如果我导入os.system或子流程,python 3脚本始终无法完成。首先运行matlab.engine,然后使用matlab.engine连接到matlab。如下面的代码所示,我的脚本将永远被卡住/挂起 #以下代码无法完成运行 导入操作系统 导入matlab.engine 系统(“matlab-r
os.system
或子流程,python 3脚本始终无法完成。首先运行matlab.engine
,然后使用matlab.engine
连接到matlab。如下面的代码所示,我的脚本将永远被卡住/挂起
#以下代码无法完成运行
导入操作系统
导入matlab.engine
系统(“matlab-r\”matlab.engine.shareEngine\“”)
截图:
奇怪的是,如果我使用os.system
或subprocess.run
启动matlab,而不导入matlab.engine
作为我建议的答案,我可以毫无问题地启动它
我还注意到,如果在启动matlab(下面的示例代码)后导入matlab.engine
,脚本将完成。但这会让我的课变得很难看
#以下代码可以完成运行
导入操作系统
系统(“matlab-r\”matlab.engine.shareEngine\“”)
导入matlab.engine
截图:
我试图通过使用subprocess.Popen
绕过这个问题。它确实启动了matlab并尝试使用matlab.engine连接到它而不停止,但是脚本永远无法连接到matlab,因为matlab.engine将在matlab完成初始化之前尝试连接
是什么导致脚本无法完成的问题?如何在标题中同时导入os/子流程和matlab.engine?我是否必须让脚本停止运行一段时间才能等待matlab完成初始化
未来的人:
系统保持打开状态,直到被调用的MATLAB退出。这就是脚本无法自行关闭的原因。
以下是一个解决方案:
- 连接到现有会话(如果有)
- 创建一个新会话并连接到它(如果没有)
当Python脚本结束时,我们的MATLAB会话仍将开放供将来使用
- 对于第一种情况,这很容易。我们可以使用
matlab.engine.find_matlab()
简单地检查现有会话
- 对于第二种情况,棘手的部分是我们不能使用
matlab.engine.start\u matlab
函数,因为正如我在我的文章中提到的,matlab进程的生命周期与Python进程的生命周期相关联。为了避免这种情况,我们希望使用Python库启动MATLAB,例如使用os
或子流程
为了连接到新运行的MATLAB,我们需要首先从MATLAB共享引擎,然后从Python连接到它。但是要做到这一点,我们需要pid
,我们不能马上得到它,因为MATLAB需要一些时间来启动
为了解决这个问题,在我的解决方案中,我使用了一个简单的文本文件,MATLAB一开始就转储它的pid
。
当文件存在时,我们知道MATLAB已经准备好,因此我们可以连接到它
运行脚本时,如果存在现有会话,它将连接到该会话:
$ python main.py
Using existing MATLAB session
Connected to MATLAB_16480
$ python main.py
Creating new MATLAB session.
Connected to MATLAB_39372!
如果没有,它将创建一个并连接到它:
$ python main.py
Using existing MATLAB session
Connected to MATLAB_16480
$ python main.py
Creating new MATLAB session.
Connected to MATLAB_39372!
以下是一个解决方案:
- 连接到现有会话(如果有)
- 创建一个新会话并连接到它(如果没有)
当Python脚本结束时,我们的MATLAB会话仍将开放供将来使用
- 对于第一种情况,这很容易。我们可以使用
matlab.engine.find_matlab()
简单地检查现有会话
- 对于第二种情况,棘手的部分是我们不能使用
matlab.engine.start\u matlab
函数,因为正如我在我的文章中提到的,matlab进程的生命周期与Python进程的生命周期相关联。为了避免这种情况,我们希望使用Python库启动MATLAB,例如使用os
或子流程
为了连接到新运行的MATLAB,我们需要首先从MATLAB共享引擎,然后从Python连接到它。但是要做到这一点,我们需要pid
,我们不能马上得到它,因为MATLAB需要一些时间来启动
为了解决这个问题,在我的解决方案中,我使用了一个简单的文本文件,MATLAB一开始就转储它的pid
。
当文件存在时,我们知道MATLAB已经准备好,因此我们可以连接到它
运行脚本时,如果存在现有会话,它将连接到该会话:
$ python main.py
Using existing MATLAB session
Connected to MATLAB_16480
$ python main.py
Creating new MATLAB session.
Connected to MATLAB_39372!
如果没有,它将创建一个并连接到它:
$ python main.py
Using existing MATLAB session
Connected to MATLAB_16480
$ python main.py
Creating new MATLAB session.
Connected to MATLAB_39372!
第一句话正是我想要达到的……好吧,我想我理解你想要达到的目标。让我分享一个答案。顺便说一下,请更改问题的标题。就目前而言,它并没有真正描述真实的问题。你能就题目给我一些建议吗?我很不擅长。第一句话正是我想要达到的……好吧,我想我理解你想要达到的目标。让我分享一个答案。顺便说一下,请更改问题的标题。就目前而言,它并没有真正描述真实的问题。你能就题目给我一些建议吗?我很不擅长。谢谢你再次回答我,但是你知道为什么os.system和SUBSPROCESS.run不工作吗?实际上,在SUBSPROCESS.Popen上运行SUBSPROCESS.run
会更容易。明天我将发布另一个答案。对不起,我不清楚在脚本完成后保持matlab共享会话打开的目的。我只想在可能的情况下重用任何matlab共享会话,所以我并不是说当我再次运行脚本时,它必须连接回同一个matlab会话。现在我可以使用matlab.engine.find_matlab()或子程序