mysql - mysqldump 和 python 子进程 wait() 不工作
问题描述
我有 4 个 shell 命令用于 mysql 导入和导出
cmd1 > exports table structure
cmd2 > exports table data
cmd4 > imports table strcuture
cmd5 > imports table data
如果我直接在命令行上运行,以下 4 个命令效果很好。每个命令都应该根据之前的 cmd 输出一个一个地执行。cmd2 和 cmd4 可能需要一些时间,因为它是导出/导入表数据。cmd2 未正确执行。我只看到空的输出文件。但如果我直接在 shell 上运行,相同的命令可以正常工作。我已经尝试过这里给出的建议python subprocess 和 mysqldump。但得到与以前相同的结果。
import subprocess
print("subprocess started....")
cmd1 = "mysqldump -h hostnamegoeshere -u FPS_DEV_User -pPASSWORD --single-transaction --no-data --triggers --routines novatime --ignore-table=novatime.novatime_detail_paycom --ignore-table=novatime.novatime_schedules --ignore-table=novatime.novatime_schedules_new > /home/ec2/dba/subprocess/mysql-migration/novatime_mysqldump_so.sql 2> /home/ec2/dba/subprocess/mysql-migration/novatime_mysqldump_so_err.sql"
cmd2 = "mysqldump --host hostnamegoeshere -u FPS_DEV_User -pPASSWORD --compress --single-transaction --no-create-info --add-locks --lock-tables --quick --disable-keys novatime > /home/ec2/dba/subprocess/mysql-migration/novatime_mysqldump_do.sql 2> /home/ec2/dba/subprocess/mysql-migration/novatime_mysqldump_do_err.sql"
cmd4 = "mysql --host hostnamegoeshere -u admin -PASSWORD -f novatime < /home/ec2/dba/subprocess/mysql-migration/novatime_mysqldump_so.sql 2> /home/ec2/dba/subprocess/mysql-migration/novatime_mysqldump_so_err.sql"
cmd5 = "mysql --host hostnamegoeshere -u admin -PASSWORD -f novatime < /home/ec2/dba/subprocess/mysql-migration/novatime_mysqldump_do.sql 2> /home/ec2/dba/subprocess/mysql-migration/novatime_mysqldump_do.sql"
try:
print('process1')
process1 = subprocess.Popen(cmd1,stdout=subprocess.PIPE, shell=True)
process1.wait()
print('process2')
process2 = subprocess.Popen(cmd2,stdout=subprocess.PIPE, shell=True)
process2.wait()
print('process4')
process4 = subprocess.Popen(cmd4,stdout=subprocess.PIPE, shell=True)
process4.wait()
print('process5')
process5 = subprocess.Popen(cmd5,stdout=subprocess.PIPE, shell=True)
process5.wait()
except:
print('error')
解决方案
您应该在等待之前关闭先前进程的标准输出。
print('process1')
process1 = subprocess.Popen(cmd1,stdout=subprocess.PIPE, shell=True)
process1.stdout.close()
process1.wait()
print('process2')
process2 = subprocess.Popen(cmd2,stdout=subprocess.PIPE, shell=True)
推荐阅读
- python - ImportError:没有名为 PIL python 2.7.10 的模块
- android - 如何从android中的程序调用#
- python - 如何从保留每个类别的第一行的数据框中删除作为属性条件的行?
- mysql - mysqldump 脚本上的 utf8 字符串无效
- python - 类型错误:
不是 JSON 可序列化的 - bash - 如何从命令行解析 rdf 格式文件
- sql - 在 Access 2016 中使用文本框作为列表框的条件
- javascript - 重生=1时如何停止法力增加和生命值增加
- excel - 4 列组合 W/ VBA
- design-patterns - 具有作业亲和性的作业队列