簡體   English   中英

python子進程終端mac osx

[英]python subprocess terminal mac osx

長期潛伏者,第一次海報。

我知道在整個interweb中有很多關於使用子進程的例子,但是我還沒有找到一個解釋我需要采取的步驟來生成一個新的終端窗口並發送命令。 有很多帖子提供了通過直接子進程調用啟動工具和腳本的變通方法,但我還沒有找到任何實際回答如何正確向終端發送命令的原始問題。

在我的例子中,我需要打開一個新的終端窗口,然后將路徑發送到特定版本的應用程序,最后是我希望在該應用程序中打開的文件的路徑。

我知道如何使用子進程直接調用所需的應用程序(無需打開可見的終端),如何使用子進程打開一個新的終端,以及如何調用應用程序路徑或文件路徑(無法同時使用使用--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

  1. 首先,我懷疑你試圖運行的命令將會運行。 你先在終端試過嗎? open -an Terminal會給你一個錯誤。 它可能應該像open -n /Applications/Utilities/Terminal.app
  2. 其次,@ korylprince是對的: open本身將創建Terminal新進程並退出。 所以你將管道與錯誤的過程聯系起來。
  3. 第三,在將ls傳遞給stdin的那一刻,該進程不存在(除非你將-W選項傳遞給open ,但由於2問題肯定無濟於事)。

所以我只看到一次機會:通過AppleScript。 您可以創建AppleScript字符串,如下所示:

tell application "System Events"
    tell process "Terminal"
        keystroke "ls"
        keystroke return
    end tell
end tell

然后通過osascript -e '<your_script>'通過osascript -e '<your_script>'運行此腳本。

是的,這很棘手(我說它是一個黑客)
是的,將多行字符串傳遞給Popen並確定正確的終端窗口可能會出現問題。
但這是可能的。

@cody

我對你答案的回答太長了,所以我正在回答:

  1. 你是對的,如果你按照你提供的方式輸入它,它會標記一個錯誤,如果你把-n放在終端之前它仍然標記一個錯誤。 但是,如果按照我在第一個示例中顯示的方式輸入它(-n在終端之后),“打開”會調用應用程序包終端的新實例,即使其中一個已經打開。

至於2-3,這就是我的研究讓我相信的東西,但我希望我錯了或錯過了某個地方的東西,這里有人可以澄清。 可悲的是,我沒有弄錯......

我應該擴展我想要做的事情,因為它可能有助於生成一種更好的方法來通過Python實現它。

我創建了一個工具,可以根據藝術家正在處理的電影,場景和鏡頭啟動應用程序文件。 對於某些應用程序,如Nuke和Houdini,從終端打開會為您提供豐富的信息,藝術家將無視這些信息,因此我們希望藝術家可以選擇啟動他們在終端中選擇的文件。 該終端必須是獨立的,以及終端的新實例,因為我創建的應用程序必須在啟動后保留,以便在不使用戶定期打開應用程序的情況下在不同的應用程序中打開其他鏡頭。

解析必要的信息,構建命令,以及啟動啟動所需應用程序的新終端都是微不足道的。 對所需文件執行相同操作也很簡單。 選擇特定版本的應用程序時會出現問題,而且我無法通過多個命令傳遞新生成的終端實例(老實說,我的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中啟動終端,然后傳遞我需要的命令。 這沒用,然后我來到這里哈哈

再次感謝任何幫助! 只知道我不能發送我想要終端的命令,這為我節省了大量的時間,而這些時間本來用於持續受挫的研究。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM