要求是这样的:
1 ) 登入 mysql 服务器( mysql -h localhost -uroot -p1234 )。
2 ) 输入 mysql 内部命令 show databases,如果返回的内容出现 mysql (存在 mysql DB )就立刻强制退出整个 python 程序。
(关于要求 2 的解释,假如 show databases 的返回内容是 information_schema \r\n mysql \r\n test。不要等到 test 出现,马上就退出或者杀死该程序)
我认为只有用 subprocess 能够比较好的完成以上功能,所以以下都是以使用 subprocess 为前提。
个人试了好多方法,都不成功。
方法 1:把 stdout 放到线程里
def stdout_theard(p_stdout):
time.sleep(0.01)
for i in range(3000):
print p_stdout.readline()
s_command = 'mysql -h localhost -uroot -p1234'
sub_process = subprocess.Popen(command , stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = True)
thread_read_output = threading.Thread(target=stdout_theard, args=(sub_process.stdout,))
thread_read_output.setDaemon('True')
thread_read_output.start()
sub_process.stdin.write('show databases;\r\n')
方法 2:把 stdout 重定向到文件里
s_command = 'mysql -h localhost -uroot -p1234'
f_out = tempfile.TemporaryFile(mode='w+')
f_err = tempfile.TemporaryFile(mode='w+')
sub_process = subprocess.Popen(command , stdin = subprocess.PIPE, stdout = f_out, stderr = f_err, shell = True)
或者:
os.dup2(sub_process.stdout.fileno(), f_out.fileno())
以上方法都没成功。
希望前辈高手们指点。
另,以上只是用 mysql 打了个比方,实际的环境不太好说。
必须得调用一个 exe ( cisco anyConnect ),得到返回值。但登陆这个 exe 的时候,一旦给定的用户名密码错误,它会一直用这组错误的用户名密码试,直到该用户被锁死。
退出的原因就是,在第一次用户名密码错误时,就退出,避免 exe 反复试,导致锁死。
1 ) 登入 mysql 服务器( mysql -h localhost -uroot -p1234 )。
2 ) 输入 mysql 内部命令 show databases,如果返回的内容出现 mysql (存在 mysql DB )就立刻强制退出整个 python 程序。
(关于要求 2 的解释,假如 show databases 的返回内容是 information_schema \r\n mysql \r\n test。不要等到 test 出现,马上就退出或者杀死该程序)
我认为只有用 subprocess 能够比较好的完成以上功能,所以以下都是以使用 subprocess 为前提。
个人试了好多方法,都不成功。
方法 1:把 stdout 放到线程里
def stdout_theard(p_stdout):
time.sleep(0.01)
for i in range(3000):
print p_stdout.readline()
s_command = 'mysql -h localhost -uroot -p1234'
sub_process = subprocess.Popen(command , stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = True)
thread_read_output = threading.Thread(target=stdout_theard, args=(sub_process.stdout,))
thread_read_output.setDaemon('True')
thread_read_output.start()
sub_process.stdin.write('show databases;\r\n')
方法 2:把 stdout 重定向到文件里
s_command = 'mysql -h localhost -uroot -p1234'
f_out = tempfile.TemporaryFile(mode='w+')
f_err = tempfile.TemporaryFile(mode='w+')
sub_process = subprocess.Popen(command , stdin = subprocess.PIPE, stdout = f_out, stderr = f_err, shell = True)
或者:
os.dup2(sub_process.stdout.fileno(), f_out.fileno())
以上方法都没成功。
希望前辈高手们指点。
另,以上只是用 mysql 打了个比方,实际的环境不太好说。
必须得调用一个 exe ( cisco anyConnect ),得到返回值。但登陆这个 exe 的时候,一旦给定的用户名密码错误,它会一直用这组错误的用户名密码试,直到该用户被锁死。
退出的原因就是,在第一次用户名密码错误时,就退出,避免 exe 反复试,导致锁死。