24

ここでの目標は、新しいシェルで新しい python ファイルを実行し、既存の python ファイルを既存のシェルで実行することです。aaa.py と bbb.py の 2 つのファイルがあるとします。簡単にするために、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)
4

3 に答える 3

49

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

場合によってos.startfileは、あなたが望むことをしますが、これは普遍的ではありません.

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


Windows cmd を使用する場合、最も簡単な方法はstartシェル コマンドです。startを含むコマンドライン プログラムの場合、python新しいコマンド ウィンドウが表示されます。したがって、次のようなものです:

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

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

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

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

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

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。または、さまざまなディストリビューションがデフォルトのターミナルをどのように構成しているかを調べて、それらすべてを検索することもできます。または…</p>

于 2013-10-11T00:36:58.423 に答える
2

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

X Window システムを使用してそれを実現できるかもしれませんが、それを実現するには、X サーバー、パーミッションなどをセットアップする必要があります。

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

Windows とシェルは少しバラバラです。

于 2013-10-11T00:52:30.313 に答える