2013-04-08 3 views
0

Я пытаюсь написать функцию Python, которая преобразует заданную систему координат в другую с помощью gdal. Проблема в том, что я пытаюсь выполнить команду как одну строку, но в оболочке мне нужно нажать Enter, прежде чем вводить координаты.Несколько команд командной строки с использованием команд команд Python

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', но это не работает.

+0

Есть ли причина, по которой вы не вызываете osr.CoordinateTransformation() изнутри Python? –

ответ

3

Я предполагаю, что вы запускаете gdaltransform нажатием Enter и координаты считываются самой программы из своего стандартного ввода , а не оболочка:

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
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 работы можно найти здесь (Altho другую тему): 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() 
Смежные вопросы