51

そのため、サブプロセスを使用してPythonスクリプト内からプロセスをスーパーユーザーとして実行しようとしています。ipythonシェルでは、次のようなものです

proc = subprocess.Popen('sudo apach2ctl restart',
                        shell=True, stdin=subprocess.PIPE,
                        stdout=subprocess.PIPE,
                        stderr=subprocess.PIPE)

正常に動作しますが、スクリプトに貼り付けるとすぐに取得し始めます: sudo: apach2ctl: command not found.

これは、sudo が ubuntu で環境を処理する方法によるものだと思います。(私も試しsudo -E apche2ctl restartてみましたsudo env path=$PATH apache2ctl restartが、役に立ちませんでした)

apache2ctl restartしたがって、私の質問は基本的に、必要に応じてユーザーにスーパーユーザーパスワードの入力を求めるスーパーユーザーとして実行したい場合、どうすればよいですか? スクリプトにパスワードを保存するつもりはありません。

編集:

コマンドを文字列とトークン化されたリストの両方として渡そうとしました。Pythonインタープリターでは、パスワードプロンプトを適切に取得する文字列を使用して(元の問題のようにPythonスクリプトではまだ機能しません)、リストにはsudoのヘルプ画面が表示されます。

編集2:

したがって、私が収集したのは、Popen は shell=True の場合、文字列と同じようにいくつかのコマンドで動作しますが、

proc = subprocess.Popen(['sudo','/usr/sbin/apache2ctl','restart'])

sudo を機能させるには、「shell=True」を使用しません。

ありがとう!

4

8 に答える 8

29

試す:

subprocess.call(['sudo', 'apach2ctl', 'restart'])

サブプロセスは、プロンプトを表示してパスワードを読み取ることができるように、実際の stdin/out/err にアクセスする必要があります。それらをパイプとして設定する場合は、自分でそのパイプにパスワードを入力する必要があります。

それらを定義しない場合は、sys.stdout などを取得します...

于 2009-02-19T23:11:30.500 に答える
21

apache2ctl へのフル パスを指定してみてください。

于 2009-02-19T22:46:38.313 に答える
6

次のように Popen を使用する必要があります。

cmd = ['sudo', 'apache2ctl', 'restart']
proc = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

リストが必要です。

于 2009-02-19T22:35:06.687 に答える