popen和mysql的python问题
我是Python新手,已经多年没有使用Linux了,所以我不知道我在哪里纠结。我正在尝试使用Popen在Ubuntu上运行MySQL中的sql文件 以下是相关代码:popen和mysql的python问题,python,mysql,popen,Python,Mysql,Popen,我是Python新手,已经多年没有使用Linux了,所以我不知道我在哪里纠结。我正在尝试使用Popen在Ubuntu上运行MySQL中的sql文件 以下是相关代码: command = ['mysql', '-uUSER', '-pPWD','-h192.168.1.132', '--database=dbName', '<', './1477597236_foo.sql' ] print("command is: "+subprocess.list2cmdline(command))
command = ['mysql', '-uUSER', '-pPWD','-h192.168.1.132', '--database=dbName', '<', './1477597236_foo.sql' ]
print("command is: "+subprocess.list2cmdline(command))
proc = subprocess.Popen(
command, stderr=subprocess.PIPE, stdout=subprocess.PIPE, cwd='.'
)
命令=['mysql'、'-uUSER'、'-pPWD'、'-h192.168.1.132'、'-database=dbName'、“因此您需要将shell=True
添加到您的Popen
调用中。当命令行中存在重定向或管道或内置命令时,需要shell=True
。然而,在类似这样的简单情况下,shell=True
是过火了。T这里有一种更简洁的方法,可以避免对输入文件进行更好的控制
- 如果输入文件不存在,则在到达子流程之前会出现异常,这更容易处理
- 进程在没有外壳的情况下运行:更好的可移植性和性能
守则:
command = ['mysql', '-uUSER', '-pPWD','-h192.168.1.132', '--database=dbName' ]
with open('./1477597236_foo.sql') as input_file:
proc = subprocess.Popen(
command, stdin = input_file, stderr=subprocess.PIPE, stdout=subprocess.PIPE )
output,error = proc.communicate()
(我添加了下一行,应该是communicate
调用:由于stdout和stderr都被重定向,这是避免两个输出流之间死锁的唯一简单方法)最后一个选项是根本不要使用子流程:典型的me:在低级别上回答,忽略全局。我的回答仍然涵盖了命令、sql或其他需要输入重定向的情况。这一点很好。
command = ['mysql', '-uUSER', '-pPWD','-h192.168.1.132', '--database=dbName' ]
with open('./1477597236_foo.sql') as input_file:
proc = subprocess.Popen(
command, stdin = input_file, stderr=subprocess.PIPE, stdout=subprocess.PIPE )
output,error = proc.communicate()