从python脚本运行imposm命令

时间:2016-01-10 03:26:21

标签: python shell openstreetmap mapnik imposm

我刚刚开始使用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 个答案:

答案 0 :(得分:0)

这可能是因为os.system()正在调用/bin/sh,它使用的是与在处理命令行时使用的shell环境不同的shell环境。

要解决此问题,请在脚本中获取imposm脚本的完整路径,然后在命令中使用该脚本。使用可以使用some code like this查找可执行文件。

或者您可以修复您的shell定义,以便/bin/sh定义了正确的PATH,但这在很大程度上取决于您的设置......

答案 1 :(得分:0)

在进一步研究和@Eli Rose的评论的帮助下解决了(非常感谢):找出影响的路径(或者你试图制作哪个命令)

which <command>

然后在python shell命令中包含路径。使用子进程中的模块,您甚至可以看到完整的终端输出。

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>

表示您可以在一行中创建命令,而不必担心在以下命令中输入数据库用户密码。