0

我正在尝试编写 Python 脚本的一部分,该脚本会在 Linux 下为小型 Web 管理界面更改根 MySQL 密码。我遵循了关于更改 root 密码的官方 MySQL 文档,并提出了这个 shell 脚本,效果很好:

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 很好地停止它。在 shell 脚本中,我可以用&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

&是一个shell的东西,所以,是的,如果你想&在后台运行命令,你需要shell。但是,您也可以完全在 Python 中执行此操作:

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