Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Can';t在页眉中同时导入os.system和matlab.engine_Python_Python 3.x_Matlab_Subprocess_Matlab Engine - Fatal编程技术网

Python Can';t在页眉中同时导入os.system和matlab.engine

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

我想启动一个共享的matlab会话,然后用相同的python 3脚本立即连接到它。我还希望在脚本完成后保持matlab会话打开。因为在将来,我想编写一个类来实现这一点,我想导入头中的所有库

问题是,如果我导入
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()或子程序