2013-07-22 116 views
2

長期潛伏者,第一次海報。蟒蛇子進程終端mac osx

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

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

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

這很不容易,就像你想的那樣。終端打開它自己的子進程(例如bash)並直接與它們進行通信。向終端的stdin發送任何內容都不會進入其他進程。您可能錯誤地處理了這個問題。 – korylprince

+0

謝謝korylprince,我會試着去改變它。欣賞迴應。 – Glenn

回答

1
  1. 首先,我懷疑你試圖運行的命令是否會運行。 您是否先在終端試用過? open -an Terminal會給你 一個錯誤。它可能應該是這樣的open -n /Applications/Utilities/Terminal.app
  2. 其次,@ korylprince是正確的:open本身將創建Terminal的新進程 並退出。所以你正在將管道連接到錯誤的進程。
  3. 第三,通過ls這一進程 標準輸入不存在(除非你將通過-W選項的open, 但肯定不會因爲2個問題幫)的時刻。

所以我看到只有一個機會來做到這一點:通過AppleScript。你可以像下一個創造一個AppleScript字符串,東西:

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

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

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

1

@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終端,然後傳遞我需要的命令。這沒有用,然後我來到這裏大聲笑

再次感謝您的幫助!只要知道我無法發送到我想要的終端命令,就可以爲我節省大量的時間,而這些時間本來會花在持續不斷的研究上。