Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.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子进程终端mac osx_Python_Macos_Terminal_Subprocess_Popen - Fatal编程技术网

python子进程终端mac osx

python子进程终端mac osx,python,macos,terminal,subprocess,popen,Python,Macos,Terminal,Subprocess,Popen,长期潜伏者,第一次海报 我知道在互联网上有很多关于使用子流程的例子,但是我还没有找到一个例子来解释我需要采取什么步骤来创建一个新的终端窗口,并向它发送命令。有很多帖子提供了通过直接子流程调用启动工具和脚本的变通方法,但我还没有找到任何能够真正回答如何将命令正确发送到终端的原始问题的帖子 在我的例子中,我需要打开一个新的终端窗口,然后发送到某个应用程序的特定版本的路径,最后是我希望在该应用程序中打开的文件的路径 我知道如何使用subprocess直接调用所需的应用程序(无需打开可见终端),如何使用

长期潜伏者,第一次海报

我知道在互联网上有很多关于使用子流程的例子,但是我还没有找到一个例子来解释我需要采取什么步骤来创建一个新的终端窗口,并向它发送命令。有很多帖子提供了通过直接子流程调用启动工具和脚本的变通方法,但我还没有找到任何能够真正回答如何将命令正确发送到终端的原始问题的帖子

在我的例子中,我需要打开一个新的终端窗口,然后发送到某个应用程序的特定版本的路径,最后是我希望在该应用程序中打开的文件的路径

我知道如何使用subprocess直接调用所需的应用程序(无需打开可见终端),如何使用subprocess打开新终端,以及如何调用应用程序路径或文件路径(无法使用--args for open()或我找到的任何其他解决方法使两者一起执行)

一旦打开终端,我就无法发送命令。下面是打开terminal的一个新实例并将其发送到ls的简单版本,这不起作用

from subprocess import Popen, PIPE, STDOUT

p = Popen(['open', '-a', 'Terminal', '-n'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)

output = p.communicate(input='ls')
print(output)
这很可能是一个微不足道的问题,我只是错过了一些东西,但我一直无法找到说明我需要什么的信息或示例,我开始对此感到失望,所以我想我会寻求帮助

非常感谢您的帮助!短暂性脑缺血发作

  • 首先,我怀疑您试图运行的命令是否会运行。 你是不是先在终点站试过<代码>打开-终端将为您提供 一个错误。它可能应该类似于
    open-n
    /应用程序/实用程序/终端应用程序
  • 其次,@korylprince是正确的:
    open
    本身将创建新的进程 进入
    终端
    并退出。因此,您将管道连接到错误的流程
  • 第三,在将
    ls
    传递给stdin的那一刻 不存在(除非您将-W选项传递给打开的
    , 但由于2)的问题,它肯定不会有帮助
  • 所以我认为只有一个机会可以做到这一点:通过AppleScript。您可以创建一个AppleScript字符串,类似于下一步:

    tell application "System Events"
        tell process "Terminal"
            keystroke "ls"
            keystroke return
        end tell
    end tell
    
    然后通过Popen通过
    osascript-e'
    运行此脚本。

    是的,这相当棘手(我认为这是一个黑客)
    是的,向Popen传递多行字符串和确定正确的终端窗口可能会有问题。
    但这是可能的。

    @cody

    我对你的回答的回答太长,因此我要回答:

  • 您是正确的,如果您按照您提供的方式输入它,它将标记错误,如果您将-n放在终端之前,它仍将标记错误。但是,如果您按照我在第一个示例中显示的方式输入它(-n在Terminal之后)“open”调用app bundle Terminal的新实例,即使其中一个实例已经打开 至于2-3,这是我的研究让我相信的,但我希望我错了,或者错过了什么,这里的人可以澄清。可悲的是,我没有错

    我可能应该详细介绍我正在尝试做的事情,因为它可能有助于生成一种更好的方法来通过Python实现它

    我创建了一个工具,可以根据艺术家正在制作的电影、场景和快照启动应用程序文件。对于某些应用程序,如Nuke和Houdini,从终端打开会为您提供丰富的信息,否则艺术家可能会忽略这些信息,因此我们希望艺术家可以选择在终端中启动他们选择的文件。该终端必须是独立的,并且是终端的一个新实例,因为我创建的应用程序必须在启动后保持不变,以便在不同的应用程序中打开其他快照,而不需要用户例行地打开该应用程序

    解析必要的信息、生成命令以及启动一个新的终端来启动所需的应用程序都是微不足道的。对所需的文件执行同样的操作也是微不足道的。当选择了某个特定版本的应用程序时,问题就出现了,而我无法用一个以上的命令传递新诞生的Terminal实例(老实说,我的OSX命令的语法也可能是问题所在,将进一步发布)

    我可以让以下两个命令正常工作:

    p = Popen(['open', '-a', 'Terminal', '-n', '--args', '/Applications/Nuke6.3v8/Nuke6.3v8.app/Nuke6.3v8'])
    
    p = Popen(['open', '-a', 'Terminal', '-n', '--args', '/Path/to/Nuke/File.nk'])  
    
    我无法使以下各项正常工作:

    p = Popen(['open', '-a', 'Terminal', '-n', '--args', '/Applications/Nuke6.3v8/Nuke6.3v8.app/Nuke6.3v8', '/Path/to/Nuke/File.nk'])
    
    从那以后,我的想法可能是我应该在Popen中启动终端,然后传递我需要的命令。那没用,然后我就来了,哈哈


    再次感谢您的帮助!仅仅知道我不能发送到我想要终止的命令就节省了我大量的时间,而这些时间本可以花在持续不断的研究上

    不幸的是,这并不像你想的那么容易。终端打开它自己的子进程(例如bash)并直接与它们通信。向终端的stdin发送任何东西都不会到达其他进程。你可能没有正确处理这个问题。谢谢korylprince,我将尝试以不同的方式处理它。感谢您的回复。