使用Python命令模块的多行shell命令

时间:2013-04-08 15:53:23

标签: python gdal

我正在尝试编写一个Python函数,使用gdal将给定的坐标系转换为另一个坐标系。问题是我正在尝试将命令作为一个字符串执行,但在shell中,我必须在输入坐标之前按Enter键。

x = 1815421
y = 557301

ret = []

tmp = commands.getoutput( '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',但这不起作用。

2 个答案:

答案 0 :(得分:3)

我的猜测是你按Enter键运行gdaltransform,程序本身从其stdin读取坐标,而不是shell:

from subprocess import Popen, PIPE

p = Popen(['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'],
    stdin=PIPE, stdout=PIPE, universal_newlines=True) # run the program
output = p.communicate("%s %s\n" % (x, y))[0] # pass coordinates

答案 1 :(得分:1)

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()

如果我没有弄错的话,命令将通过“会话”执行,从而保持命令之间所需的任何niformation。

更准确地说,使用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

有关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() 的工作原理的详细信息可以在这里找到(不同主题):python subprocess stdin.write a string error 22 invalid argument




解决方案

无论如何,这个应该工作(你必须重定向STDIN 和STDOUT):

{{1}}