3

長年の潜伏者、初めてのポスター。

サブプロセスの使用に関するインターウェブ全体にかなりの数の例があることは知っていますが、新しいターミナルウィンドウを作成してコマンドを送信するために必要な手順を説明する例をまだ見つけていません. 直接のサブプロセス呼び出しを介してツールやスクリプトを起動するための回避策を提供する投稿はたくさんありますが、コマンドを端末に適切に送信する方法に関する最初の質問に実際に答える投稿は見つかりませんでした。

私の場合、新しいターミナル ウィンドウを開き、特定のバージョンのアプリケーションへのパスを送信し、最後にそのアプリケーションで開きたいファイルへのパスを送信する必要があります。

サブプロセスを使用して必要なアプリケーションを直接呼び出す方法 (表示されている端末を開かずに)、サブプロセスを使用して新しい端末を開く方法、およびアプリケーション パスまたはファイル パスのいずれかを呼び出す方法 (両方を取得することはできませんでした) を知っています。 --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)

これは些細な問題である可能性が高く、何かが欠けているだけですが、必要なものを説明する情報や例を見つけることができず、イライラし始めているので、助けを求めることにしました.

どんな支援も大歓迎です!ティア

4

2 に答える 2

2

@コーディ

あなたの回答に対する私の回答が長すぎたので、回答するために回答を作成しています:

  1. あなたが提供した方法で入力するとエラーが発生し、Terminal の前に -n を置くとエラーが発生します。ただし、最初の例で示した方法で入力すると (Terminal の後に -n)、「open」は、アプリ バンドル ターミナルが既に開いている場合でも、新しいインスタンスを呼び出します。

2-3に関しては、それは私の研究が私に信じさせていたことのようなものでしたが、私が間違っているか、どこかで何かを見逃していて、ここの誰かが明らかにしてくれることを望んでいました. 残念ながら、私は間違っていませんでした…

おそらく、Python を介してそれを達成するためのより良い方法を生成するのに役立つので、私がやろうとしていることを拡張する必要があります。

アーティストが取り組んでいる映画、シーン、ショットに基づいてアプリケーション ファイルを起動するツールを作成しました。Nuke や Houdini などの一部のアプリケーションでは、Terminal から開くことで、アーティストが他の方法では見えない豊富な情報が得られるため、アーティストが選択したファイルを Terminal で起動するオプションをアーティストに提供したいと考えています。そのターミナルはスタンドアロンであり、ターミナルの新しいインスタンスである必要があります。これは、ユーザーが定期的にアプリを開くことなく、別のアプリケーションで他のショットを開くために、作成したアプリが起動後も存続する必要があるためです。

必要な情報の解析、コマンドの構築、目的のアプリケーションを起動する新しいターミナルの起動はすべて簡単でした。目的のファイルで同じことを行うのも簡単でした。アプリの特定のバージョンが選択されたときに問題が発生し、新しく生成されたターミナルのインスタンスを複数のコマンドで渡すことができませんでした (正直なところ、OSX コマンドの構文も問題になる可能性があります。投稿しますさらに下)。

次の 2 つのコマンドを問題なく動作させることができます。

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 でターミナルを起動し、必要なコマンドを渡す必要があると考えました。それがうまくいかなかったので、ここに来ました笑

助けてくれてありがとう!ターミナルに送信したいコマンドを送信できないことを知っているだけで、イライラする調査に費やされていたはずの時間を大幅に節約できます。

于 2013-07-23T18:01:02.547 に答える
2
  1. まず、実行しようとしているコマンドがまったく実行されるとは思えません。最初にターミナルで試しましたか?open -an Terminalエラーが発生します。おそらく次のようなものになるはずですopen -n /Applications/Utilities/Terminal.app
  2. 第二に、@korylprince は正しいです。openそれ自体が新しいプロセスを作成Terminalして終了します。したがって、パイプを間違ったプロセスにリンクしています。
  3. 第 3 に、stdin に渡す時点で、lsそのプロセスはまだ存在していません (-W オプションを に渡す場合を除きますがopen、2 の問題のために確かに役に立ちません)。

したがって、これを行う機会は 1 つしかないと思います。それは、AppleScript を使用することです。次のような AppleScript 文字列を作成できます。

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

次に、このスクリプトをosascript -e '<your_script>'Popen 経由で実行します。

はい、かなりトリッキーです (ハックだと思います)
はい、複数行の文字列を Popen に渡し、正しいターミナル ウィンドウを決定する際に問題が発生する可能性があります。
しかし、それは可能です。

于 2013-07-23T06:08:57.683 に答える