展開に関係なく、Pythonで端末を開きます。

展開に関係なく、Pythonで端末を開きます。

私はDjango新しいターミナルを開きますdocker exec

これが私が実装した方法です。

current_os = platform.system()
exec_command = f"docker exec -it {container_id} /bin/{shell}"
if current_os == "Windows":
    command = f"start powershell /c {exec_command}"
elif current_os == "Darwin":
    command = f"osascript -e 'tell app \"Terminal\" to do script \"{exec_command}\"'"
elif current_os == "Linux":
    command = f"gnome-terminal -- sh -c \"{exec_command}\""  # TODO tests
else:
    raise Exception("An unknown OS was detected. Unable to open a terminal.")

if os.system(command) != 0:
    raise Exception("There was an error opening a new terminal.")

私の質問は:gnome-terminal実際にはほとんどのディストリビューションで動作しますか?そうでない場合はどうすればよいですか?どのようにエラー防止機能がありますか?インターネットを検索しても実際の解決策は出ませんでした。
端末を開くときに自動的にコマンドを実行したいのですが、コマンドを実行した後に端末が閉じないようにする属性が必要であることに注意してください。

Ubuntu 20.04でのみLinuxケースをテストできます。

答え1

人々がすでに指摘したように、「Linux」のようなものはありません。 「Debian」、「Fedora」、「Arch」、「Gentoo」などがあり、そのバリエーションもあります。これらすべての機能が利用できると確信できますが/bin/shできない特定の端末アプリケーションがインストールされているとします。

一般的なターミナルアプリケーションのリストを作成し、動作するアプリケーションが見つかるまで繰り返すことができます。たとえば、次のようになります。

import random
import subprocess

class NoTerminalError(Exception):
    pass

possible_terminals = [
        ('lxterminal', lambda cmd: ['lxterminal', '-e', '/bin/sh', '-c', cmd]),
        ('xfce4-terminal', lambda cmd: ['xfce4-terminal', '-x', '/bin/sh', '-c', cmd]),
        ('xterm', lambda cmd: ['xterm', '-e', '/bin/sh', '-c', cmd]),
        ('gnome-terminal', lambda cmd: ['gnome-terminal', '--', "/bin/sh", "-c", cmd]),
        ]

def find_terminal():
    random.shuffle(possible_terminals)
    for name, cmdline in possible_terminals:
        try:
            subprocess.run(cmdline("/bin/true"), check=True)
            return name, cmdline
        except subprocess.CalledProcessError:
            pass

    raise NoTerminalError()


name, cmdline = find_terminal()
print('using terminal', name)
subprocess.run(cmdline('cmatrix'), check=True)

または、ドキュメントに「このプログラムには次のものが必要です。ここに名前を入力してください」。

関連情報