25

ボタンのあるPyGtkGuiを作ろうとしています。ユーザーがこのボタンを押すとgnome-terminal、ユーザーにパスワードの入力を求めるプロンプトが表示されます。

次に、このGitリポジトリgeditJQueryスニペット用に複製します。

次に、js.xmlファイルをにコピーします/usr/share/gedit/plugins/snippets/js.xml

最終的に、Gitリポジトリを強制的に削除します。

コマンド:

gnome-terminal -x sudo git clone git://github.com/pererinha/gedit-snippet-jquery.git && sudo cp -f gedit-snippet-jquery/js.xml /usr/share/gedit/plugins/snippets/js.xml && sudo rm -rf gedit-snippet-jquery

私の端末では正常に動作します。

しかし、 GUIを介して開くだけで、パスワードを追加し、Enterキーを押すと、再び閉じます。

最初のコマンドのみを実行したい&&

これは私のPython関数です(コマンド付き):

def on_install_jquery_code_snippet_for_gedit_activate(self, widget):
    """ Install Jquery code snippet for Gedit. """
    cmd="gnome-terminal -x sudo git clone git://github.com/pererinha/gedit-snippet-jquery.git && sudo cp -f gedit-snippet-jquery/js.xml /usr/share/gedit/plugins/snippets/js.xml && sudo rm -rf gedit-snippet-jquery"
    p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT,
             close_fds=False)
    self.status.set_text(p.stdout.read()) #show response in 'status
4

1 に答える 1

70

あなたの質問に直接答えるには、以下を読んでください。しかし、あなたのプログラムには多くの問題があり、そのいくつかは「より良い実践」で取り上げます。


デフォルトでは、subprocess.Popenコマンドは文字列のリストとして提供されます。

shellただし、引数を使用して、「シェルプロンプトで入力したときとまったく同じようにフォーマットされた」コマンドを実行することもできます。

いいえ:

>>> p = Popen("cat -n file1 file2")

はい:

>>> p = Popen("cat -n file1 file2", shell=True)
>>> p = Popen(["cat", "-n", "file1", "file2"])

これら2つのオプションにはいくつかの違いがあり、それぞれに有効な使用例があります。私は違いを要約しようとはしません-Popenドキュメントはすでにそれの素晴らしい仕事をしています。


したがって、コマンドの場合は、次のようにします。

cmd = "gnome-terminal -x sudo git clone git://github.com/pererinha/gedit-snippet-jquery.git && sudo cp -f gedit-snippet-jquery/js.xml /usr/share/gedit/plugins/snippets/js.xml && sudo rm -rf gedit-snippet-jquery"
p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT,
          close_fds=False)

より良い練習

ただし、多くのシステムコマンドのラッパーとしてPythonを使用することは、実際には良い考えではありません。少なくとも、ゼロ以外の出口を適切に処理できるように、コマンドを別々のポペンスに分割する必要があります。実際には、このスクリプトはシェルスクリプトとしてはるかに適しているようです。しかし、Pythonを主張する場合は、より良い方法があります。

osモジュールは、およびへの呼び出しの代わりにrmなりcpます。私はそれを使った経験はありませんが、Gitリポジトリと対話するためにGitPythonのようなツールを見たいと思うかもしれません。

互換性の懸念

gnome-terminal最後に、とへの呼び出しには注意が必要ですsudo。すべてのGNU/LinuxユーザーがUbuntuを実行しているわけではなく、すべてのユーザーがsudo、またはGNOMEターミナルエミュレーターをインストールしているわけではありません。現在の形式では、次の場合、スクリプトはかなり役に立たずにクラッシュします。

  • sudoコマンドがインストールされていません
  • ユーザーはsudoersグループに含まれていません
  • ユーザーはGNOMEまたはそのデフォルトのターミナルエミュレーターを使用していません
  • Gitがインストールされていません

ユーザーがUbuntuを実行していると想定する場合x-terminal-emulatorは、直接呼び出すよりもはるかに優れたオプションですgnome-terminal。インストールされているターミナルエミュレーター(xfce4-terminalXubuntuのユーザーなど)を呼び出すためです。

于 2012-07-03T11:22:19.550 に答える