无法在 Mac 上创建带有子进程的新控制台

Posted

技术标签:

【中文标题】无法在 Mac 上创建带有子进程的新控制台【英文标题】:Not able to create a new console with subprocess on a Mac 【发布时间】:2020-01-26 07:36:54 【问题描述】:

我开发了一个 python 脚本,可以在不同的控制台中启动几个 Node.js 应用程序。它可以在 Windows(python 版本 3.7.3)上运行,但不能在 Mac(3.7.4_1)上运行。

我一直在滚动 python 文档,但没有看到任何问题,而且我在堆栈溢出中发现的几篇帖子都没有解决我的问题。

这是错误:

subprocess.Popen(['node', 'index.js'],
creationflags=subprocess.CREATE_NEW_CONSOLE, shell=False)

AttributeError: 模块 'subprocess' 没有属性 'CREATE_NEW_CONSOLE'

代码如下:

def __runProject(self, project):
    print(f'Starting project \'project.projectName\'...')
    subprocess.Popen(['node', 'index.js'], creationflags=subprocess.CREATE_NEW_CONSOLE, shell=False)
    os.chdir(self.__currentWorkingDirectory)

提前谢谢你!

【问题讨论】:

您是否看到说明该变量仅适用于 Windows 的文档? ***.com/q/29633719/2308683 谢谢。我读过但错过了这部分。不过,鉴于我想打开多个控制台以同时启动多个进程,你会建议怎么做?谢谢 这应该适用于 macOS:subprocess.Popen(['/usr/bin/open', '-n', '-a', 'Terminal', '/usr/local/bin/ node', 'index.js'], shell=False) 【参考方案1】:

确实,macOS 终端在打开新命令后运行命令时有所不同。 诀窍是使用“打开”命令。 该参数实际上应该是要运行的命令文件。 因此,对于使用参数 index.js 运行节点,以下代码将创建一个命令文件 (start_node.command),该文件将使用来自新终端的参数启动节点:

with open("start_node.command", "w") as f:
    f.write("#!/bin/sh\nnode index.js\n")
    os.chmod('myfile', stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IWGRP | stat.S_IROTH)
subprocess.Popen(['/usr/bin/open', '-n', '-a', 'Terminal', 'start_node.command'], shell=False)

【讨论】:

终端的参数必须是绝对或相对路径。没有对参数进行路径搜索。 所提供的答案被标记为低质量帖子以供审核。以下是How do I write a good answer? 的一些指南。这个提供的答案可能是正确的,但它可以从解释中受益。仅代码答案不被视为“好”答案。来自review。 感谢您的评论。下次我的帖子会提供更多信息。 答案可以是edited来解释怎么回事。 再次更新帖子。终端的参数实际上应该是一个命令文件,它使用参数启动节点。

以上是关于无法在 Mac 上创建带有子进程的新控制台的主要内容,如果未能解决你的问题,请参考以下文章

C++中如何实现子进程打开控制台窗口

jconsole 无法连接到我的新 Mac Air 上的本地进程

当没有附加控制台时,python 子进程似乎无法正常工作

(疑问)进程控制---vfork 函数

java:关闭子进程标准流?

无法使用子进程从标准输出获取结果