web-dev-qa-db-ja.com

新しい端末ウィンドウでpythonから端末コマンドを実行しますか?

ここでの目標は、新しいシェルで新しいpythonファイルを実行し、既存のシェルで既存のpythonファイルを実行することです。aaaという2つのファイルがあるとします。 pyとbbb.py.簡単にするために、aaa.pyのすべては...

subprocess.call('python bbb.py', Shell=True)

...そして、bbb.pyは...

print 'It worked'

ここでの目標は、ターミナル1でaaa.pyを実行し、ターミナル2でbbb.pyを起動することです。以下のようなコマンドが存在することを期待しますが、理解できません。

subprocess.call_in_new_window('python bb.py', Shell=True)
20
Evan Cathcart

一般に、シェルからこれを行う方法はありません。あなたがしなければならないことは、ターミナルプログラム自体、またはあなたのためにそうするランチャープログラムを実行することです。そして、それを行う方法は端末プログラムごとに異なります。

場合によっては、 os.startfile で目的の処理を実行できますが、これは万能ではありません。

また、一般的に、新しいターミナルウィンドウは新しいシェルを実行するため、必ずしも同じ作業ディレクトリを持たないため、実際にはスクリプトへの絶対パスが必要になることに注意してください。しかし、例ではそれを無視します。


Windows cmdを使用する最も簡単な方法は、 start Shellコマンドです。 startpythonを含むコマンドラインプログラムである場合、新しいcmdウィンドウが表示されます。だから、次のようなもの:

subprocess.call('start /wait python bb.py', Shell=True)

OS Xにも同様のコマンド open があります。また、これはシェルコマンドではなく実際のプログラムなので、Shell=Trueは必要ありません。ただし、openを指定してコマンドラインプログラムまたはスクリプトを実行しても、通常、新しいターミナルウィンドウは開きません。実際、それの全体的なポイントは、Finderでダブルクリックされているかのようにプログラムを実行できるようにすることです。

そのため、一時的な.commandラッパーファイルとopen thatを作成できます。このようなもの(未テスト):

with tempfile.NamedTemporaryFile(suffix='.command') as f:
    f.write('#!/bin/sh\npython bb.py\n')
    subprocess.call(['open', '-W', f.name])

または、次のようなTerminal.appを使用するように明示的にopenに指示することもできます。

subprocess.call(['open', '-W', '-a', 'Terminal.app', 'python', '--args', 'bb.py'])

または、AppleEventsを介してTerminal.appのスクリプトを作成できます。例えば:

appscript.app('Terminal').do_script('python bb.py')

「do script」イベントは新しいウィンドウを開き、引数をコマンドとして実行します。より詳細な制御が必要な場合は、AppleScript Editorでスクリプトディクショナリを開き、できることをすべて確認してください。


Linuxまたはその他の* nixシステムでは…65,102種類のデスクトップ環境、ランチャー、ターミナルプログラムがあります。それらすべてに取り組む必要がありますか?

Gnome-terminalでは、ターミナルを再度実行するだけで新しいウィンドウが表示され、-x引数を使用すると初期コマンドを指定できます。

subprocess.call(['gnome-terminal', '-x', 'python bb.py'])

多くの古い端末は、xtermと互換性を保とうとしますが、-eと同じことを行います。

subprocess.call(['xterm', '-e', 'python bb.py'])
subprocess.call(['rxvt', '-e', 'python bb.py'])

…など.

ユーザーが使用している端末をどのように知るのですか?良い質問。ターミナルのように見えるものを見つけるまで、自分から親プロセスのように歩くことができます。または、誰もがxtermを持っていると仮定できます。または、さまざまなディストリビューションがデフォルトのターミナルをどのように構成しているかを調べて、それらすべてを検索することもできます。または…

31
abarnert

少なくともあなたがそれについて考えているほど単純ではないので、あなたはそれを実現することはできません。 「ターミナルウィンドウ」が原因でMacについて話しているのではないかと思います。

X Windowシステムを使用してそれを実現できるかもしれませんが、それを実現するには、設定するもの、Xサーバー、許可などが必要になります。

最近では、そのようなことは通常、通常のセキュリティ境界に違反しています。提案どおりに動作するプログラムをダウンロードするとします。あなたと同じ権限を持つウィンドウ(ターミナル)(あなたには見えない)が表示されます。すべてのディレクトリとファイルを読み取り、それらをプログラムの発信者に発送します。あなたはそれで満足していないかもしれません。いつも、あなたはゲームをプレイしていると思ってから終了し、2番目のシェルが実行され続けます。

ウィンドウとシェルは少しばらばらです。

2
Fred Mitchell

これはおそらくコメントになりますが、まだできませんので...

Windowsでは、次のことができます。

subprocess.call('python bb.py', creationflags=subprocess.CREATE_NEW_CONSOLE)
1
DSM