Cli*_*ore 2 python mysql subprocess
问候.
我编写了一个在子进程中调用MySQL的python脚本.[是的,我知道正确的方法是使用MySQLdb,但在OS X Leopard下编译它是一件痛苦的事情,如果我想在不同架构的计算机上使用该脚本,可能会更痛苦.]子处理技术有效,前提是我在启动进程的命令中提供密码; 但是,这意味着计算机上的其他用户可以看到密码.
我写的原始代码可以在这里看到.
下面的这个变种非常相似,虽然我会省略测试例程以保持更短:
#!/usr/bin/env python
from subprocess import Popen, PIPE
# Set the command you need to connect to your database
mysql_cmd_line = "/Applications/MAMP/Library/bin/mysql -u root -p"
mysql_password = "root"
def RunSqlCommand(sql_statement, database=None):
"""Pass in the SQL statement that you would like executed.
Optionally, specify a database to operate on. Returns the result."""
command_list = mysql_cmd_line.split()
if database:
command_list.append(database)
# Run mysql in a subprocess
process = Popen(command_list, stdin=PIPE, stdout=PIPE,
stderr=PIPE, close_fds=True)
#print "Asking for output"
#needs_pw = process.stdout.readline()
#print "Got: " + needs_pw
# pass it in the password
process.stdin.write(mysql_password + "\n")
# pass it our commands, and get the results
#(stdout, stderr) = process.communicate( mysql_password + "\n" + sql_statement)
(stdout, stderr) = process.communicate( sql_statement )
return stdout
Run Code Online (Sandbox Code Playgroud)
我怀疑MySQL密码提示实际上并不在stdout(或stderr)上,虽然我不知道它是怎么回事,或者它是否意味着我可以捕获它.
在提供密码之前,我确实尝试先读取输出,但它没有用.我也试过传递密码
同样,如果我在命令行上提供密码(因此在"Popen"和"communication"函数之间没有代码),我的包装函数就可以工作了.
两个新的想法,月laster:
使用pexpect会让我提供密码.它模拟tty并获得所有输出,甚至是绕过stdout和stderr的输出.
在早期的alpha中有一个名为MySQL Connector/Python的项目,它允许提供一个纯python库来访问MySQL,而不需要你编译任何C代码.
您可以简单地构建一个my.cnf文件并指向mysql命令.显然,您需要使用permissions/acls保护该文件.但是,在python脚本中使用密码或者在python脚本的配置中,它不应该真的更安全.
所以你会做类似的事情
mysql_cmd_line = "/Applications/MAMP/Library/bin/mysql --defaults-file=credentials.cnf"
Run Code Online (Sandbox Code Playgroud)
你的配置看起来像这样
[client]
host = localhost
user = root
password = password
socket = /var/run/mysqld/mysqld.sock
Run Code Online (Sandbox Code Playgroud)