Запускать команды 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
определяется, но это сильно зависит от вашей настройки...