长期潜伏,第一次海报.
我知道整个Internet上有很多关于使用子进程的示例,但是我还没有找到一个示例来说明创建新的终端窗口并发送命令所需的步骤.有很多文章提供了解决方法,可通过直接子流程调用来启动工具和脚本,但是我还没有找到能真正回答如何正确向终端发送命令的原始问题的解决方法.
就我而言,我需要打开一个新的终端窗口,然后将路径发送到特定版本的应用程序,最后将路径发送到我希望在该应用程序中打开的文件.
我知道如何使用子流程直接调用所需的应用程序(而无需打开可见的终端),如何使用子流程打开新终端,以及如何调用应用程序路径或文件路径(无法同时访问两者)使用–args一起执行open()或我发现的任何其他解决方法).
打开终端后,我无法向终端发送命令.以下是打开终端的新实例并将其发送给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)
这很可能是一个琐碎的问题,我只是缺少一些东西,但是我一直找不到能说明我需要的信息或示例,因此我开始对此感到沮丧,因此我想寻求帮助.
非常感谢您的协助! TIA
解决方法:
>首先,我怀疑您尝试运行的命令是否会完全运行.
您是否首先在终端上尝试过?打开-终端会给你
一个错误.它可能应该像open -n
/Applications/Utilities/Terminal.app
>其次,@ korylprince是正确的:打开自身将创建新过程
航站楼和出口.因此,您将管道连接到错误的过程.
>第三,在将ls传递给标准输入的过程中
还不存在(除非您将-W选项传递给打开的位置,
但由于2问题,它当然无济于事.
因此,我看到这样做的机会只有一个:通过AppleScript.您可以创建一个AppleScript字符串,如下所示:
tell application "System Events"
tell process "Terminal"
keystroke "ls"
keystroke return
end tell
end tell
然后通过osascript -e’< your_script>‘运行此脚本通过Popen.
是的,这非常棘手(我会说这是一个hack)
是的,将多行字符串传递给Popen以及确定正确的终端窗口可能会出现问题.
但是有可能.