如何在python脚本中执行多个命令的命令

问题描述:

我试图在我的python脚本中使用subprocess.Popen()顺序执行几个linux命令。但是,这似乎是我写脚本的方式,python正在执行某种类型的执行并忘记,并且在开始步骤2之前不等待第1步完成。如何在python脚本中执行多个命令的命令

例如,我试图:

  1. 执行SQL命令,将结果写入远程服务器的 /tmp中的文件。
  2. 当我完成使用该文件后,我想删除远程文件,所以我们没有用完空间。

发生了什么是python似乎运行第1步的cmd,并没有等待第1步完成,它运行第2步。因此,该文件仍然挂起,因为在创建文件之前运行删除。

这是我的代码片段。希望有人能告诉我如何做到这一点,所以第2步只在第1步完成后运行。我试图匿名/简化代码片段,以便在匿名代码时避免任何错误。

sqlCmd = "ssh " + HOST + "mysql -h host -ppwd -q select blah from table where foo = 'bar' INTO OUTFILE '/tmp/blah_bydate.csv" 
    rmCmd = "ssh " + HOST + " rm -f /tmp/blah_bydate.csv" 
    proc = subprocess.Popen(sqlCmd, shell=True, stdout=subprocess.PIPE) 
    proc = subprocess.Popen(rmCmd, shell=True, stdout=subprocess.PIPE) 

我发现一些上那么,建议的解决办法是做类似

subprocess.Popen([cmd1; cmd2; cmd3], shell=True, stdout=subprocess.PIPE) 

,我不想做,因为我的命令,参数化和可长/复杂。

+0

考虑运行单个'ssh'会话... – 2015-03-18 22:50:09

+1

详细说明@Karoly:在* nix中,如果有''ls; cp a.txt b.txt''''cp'将不会被执行,直到'ls'命令完成。而且,如果你使用''ls && cp a.txt b.txt'','cp'将不会被执行,除非'ls'成功完成。因此,建立一个统一的_Cmd_字符串,将你的'mysql'和'rm'命令与';'或'&&'连接起来。 – boardrider 2015-03-19 10:47:16

只需使用subprocess.call而不是subprocess.Popen,它应该阻塞,直到过程结束。

+1

要牢记的另一件事是确保您清理'HOST',因为您使用'shell = True'。文档[此处]有警告(https://docs.python.org/2/library/subprocess.html#frequently-used-arguments)。 – 2015-03-18 22:49:50

+0

感谢您的警告。我读过警告,但如果shell = False,该命令不起作用,并给出了另一个错误,所以我必须让shell = True使每个人(我和python)开心=) – Classified 2015-03-18 23:02:21

+1

当然。关键是要确保你不让不择手段的互联网人给你HOST的价值。 :P – 2015-03-18 23:04:42

如果您需要,可以使用proc.wait(),它甚至可以取超时值。