Python Bash Pipe - PullRequest
       16

Python Bash Pipe

2 голосов
/ 04 декабря 2009

Я хочу передать вывод скрипта Python скрипту bash. До сих пор я пытался использовать os.popen(), sys.subprocess() и пытался привести канал для примера

os.popen('echo "P 1 1 591336 4927369 1 321 " | v.in.ascii -zn out=abcx format=standard --overwrite')

, но это не сработало, значения "591336" и "4927369" являются переменными, которые являются выходными данными скрипта python. но когда я делаю это или изменяю значения вручную, повторяя команду echo и pipe, это работает (в bash).

v.in.ascii -zn out=abcx format=standard --overwrite

вышеуказанная часть команды bash является частью Grass GIS

Может кто-нибудь мне помочь!

Ответы [ 4 ]

6 голосов
/ 04 декабря 2009

Вы можете просто использовать print для вывода на стандартный вывод и передать процесс Python следующему процессу, например,

python myprogram.py | ...

Где myprogram.py может выглядеть так:

for x in something:
    print dosomething(x)
1 голос
/ 05 декабря 2009

Начиная с Python 2.6, модуль subprocess рекомендуется вместо устаревшего os.popen. Вот пример:

from subprocess import Popen, PIPE
p = Popen(["v.in.ascii", "-zn", "out=abcx", "format=standard", "--overwrite"], stdin=PIPE)
p.stdin.write("P 1 1 591336 4927369 1 321\n")
p.stdin.close()
p.wait() # unless background execution preferred
1 голос
/ 04 декабря 2009

Это работает для меня:

>>> stdin, stdout = os.popen2("echo %s | grep 'test'" % 'some test param')
>>> print stdout.read()
some test param

>>>
0 голосов
/ 04 декабря 2009

Мне очень нравится ответ Джона Полетта.

Я думаю, ваш пример echo сработал бы, если бы вы использовали os.system вместо os.popen.

Один из способов использования popen здесь такой:

f = os.popen("v.in.ascii -zn out=abcx format=standard --overwrite", 'w')
f.write("P 1 1 591336 4927369 1 321\n")
f.close()

(Вы должны указать канал для записи.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...