from subprocess import *
c = 'command 1 && command 2 && command 3'
# for instance: c = 'dir && cd C:\\ && dir'
handle = Popen(c, stdin=PIPE, stderr=PIPE, stdout=PIPE, shell=True)
print handle.stdout.read()
handle.flush()
如果我没记错的话,命令将通过“会话”执行,从而在命令之间保留您需要的任何信息。
更准确地说,使用shell=True
(从我一直以来的观点)是,如果给定一串命令而不是列表,则应该使用它。如果您想使用列表建议,请执行以下操作:
import shlex
c = shlex.split("program -w ith -a 'quoted argument'")
handle = Popen(c, stdout=PIPE, stderr=PIPE, stdin=PIPE)
print handle.stdout.read()
然后捕获输出,或者您可以使用开放流并使用handle.stdin.write()
,但这有点棘手。
除非你只想执行、阅读和死亡,.communicate()
是完美的,或者只是.check_output(<cmd>)
Popen
在这里可以找到很好的信息n如何工作(虽然不同的主题): python subprocess stdin.write a string error 22 invalid argument
解决方案
无论如何,这应该有效(您必须重定向 STDIN和 STDOUT):
from subprocess import *
c = 'gdaltransform -s_srs \'+proj=lcc +lat_1=34.03333333333333 +lat_2=35.46666666666667 +lat_0=33.5 +lon_0=-118 +x_0=2000000 +y_0=500000 +ellps=GRS80 +units=m +no_defs\' -t_srs epsg:4326 \n' + str(x) + ' ' + str(y) + '\n'
handle = Popen(c, stdin=PIPE, stderr=PIPE, stdout=PIPE, shell=True)
print handle.stdout.read()
handle.flush()