我刚刚开始使用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用户的密码。有没有办法在同一行命令中发送密码? (也许这需要成为一个新职位?如果有人指出我正确的方向,那就很开心)**
答案 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>
表示您可以在一行中创建命令,而不必担心在以下命令中输入数据库用户密码。