0

Linux で小さな web-admin インターフェイスのルート MySQL パスワードを変更する Python スクリプトの一部を作成しようとしています。root パスワードの変更に関する MySQL の公式ドキュメントに従って、うまく機能する次のシェル スクリプトを作成しました。

shopt -s xpg_echo
# stopping running MySQL server
invoke-rc.d mysql stop

# creating init file in a mysqld readable location
cat > /var/lib/mysql/mysql-init <<END
UPDATE mysql.user SET Password=PASSWORD('x123') WHERE User='root';
FLUSH PRIVILEGES;
END

# running mysqld_safe with init-file in the background
mysqld_safe --init-file=/var/lib/mysql/mysql-init &

sleep 5

# stopping mysql
invoke-rc.d mysql stop

# deleting the init file
rm /var/lib/mysql/mysql-init

# starting mysql
invoke-rc.d mysql start

mysqld_safe を起動して数秒間実行し、invoke-rc.d で適切に停止する必要がある部分があります。シェルスクリプトでは、&and で解決できsleep 5ました。

私の問題は、 shell=True を使用せずに Python スクリプトでこれを行う方法がわからないことです。Popen と shlex.split(cmd) を使用して他のすべての部分を実行できますが、& は shlex.split(cmd) または shell=False を通過しないようです。

コマンドラインでの単純な問題&ですか、それともこれには shell=True が本当に必要ですか? そうでない場合、スレッドを使用する必要がありますか?

4

2 に答える 2

1

私はおそらく何かが欠けていますが、このようなものは機能しませんか?

import time
import subprocess

p = subprocess.Popen(['mysqld_safe', '--init-file=/var/lib/mysql/mysql-init'])
time.sleep(5)
subprocess.call(['invoke-rc.d', 'mysql', 'stop'])
于 2012-09-09T18:53:00.693 に答える
-1

&&はシェルのものなので、バックグラウンドでコマンドを実行するために使用したい場合は、シェルが必要です。ただし、これを完全に Python で行うこともできます。

proc = subprocess.Popen(["mysqld_safe", "--init-file=/var/lib/mysql/mysql-init"])
time.sleep(5)
proc.kill()
于 2012-09-09T18:29:06.020 に答える