Запускать команды Imposm из скрипта Python

Я только начинаю использовать Imposm, чтобы помочь перенести данные openstreetmap в базу данных postgis. Все документы указывают на выполнение всех команд через терминал. Это хорошо для однократного импорта, но я планирую много разных импортов ограничивающих рамок и хотел бы написать сценарий загрузки данных в базу данных.

В настоящее время я использую:

imposm --overwrite-cache --read --write -d postgis_test --user postgres -p ""  /Users/Me/MapnikTest/osmXML.osm

Это прекрасно работает из командной строки, но так как osmXML.osm создается много раз, я бы хотел как-то импортировать это на этапе создания.

Помещение того же самого в скрипт Python как:

os.system("imposm --overwrite-cache --read --write -d postgis_test --user postgres -p ""  /Users/Ali\ Mac\ Pro/Desktop/MapnikTest/osmXML.osm")

просто возвращает:

/bin/sh: imposm: command not found

Решение этого было бы последним шагом для автоматизации сбора данных для рендеринга небольших карт по требованию, но я попал в последнее препятствие!

** Редактирование полного пути к Imposm решило первую проблему, но при появлении запроса вводится пароль для пользователя postgres. Есть ли способ отправить пароль в той же однострочной команде? (может быть, это должен быть новый пост? Счастлив, если кто-то укажет мне правильное направление)**

2 ответа

Решено с помощью дальнейших исследований и комментариев @Eli Rose (большое спасибо): выяснить, какой путь к импозму (или какую команду вы пытаетесь сделать) с помощью

which <command>

Затем включите путь в команду оболочки python. Используя модуль из подпроцесса, вы даже можете увидеть полный вывод терминала.

import subprocess
from subprocess import *
print Popen("/usr/local/bin/imposm --overwrite-cache --read --write --connection postgis://<database user>:<password>@<host>/<database> /path/to/data.osm", stdout=PIPE, shell=True).stdout.read()

--connection postgis://<database user>:<password>@<host>/<database>

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

Это наверное потому что os.system() звонит /bin/sh которая использует среду оболочки, отличную от той, которую вы используете при работе в командной строке.

Чтобы обойти это, в вашем скрипте получите полный путь к imposm сценарий, а затем использовать это в вашей команде. Использование может использовать некоторый код, подобный этому, чтобы найти исполняемый файл.

Или вы можете исправить ваши определения оболочки так, чтобы /bin/sh имеет надлежащий PATH определяется, но это сильно зависит от вашей настройки...

Другие вопросы по тегам