【问题标题】:Python subprocess does not transfer argumentsPython 子进程不传输参数
【发布时间】:2018-04-16 06:42:39
【问题描述】:

我想使用osmosis 自动执行从大型 OSM 文件中提取数据的过程,但我在运行此代码 sn-p 以自动从 OSM 数据创建切片时遇到问题:

import sys
import subprocess

def create_tile_pbf(pbf_file, tile_lng, tile_lat):
    """Runs the osmosis tile creator"""
    app_path = "osmosis/bin/"
    app = "osmosis.bat"
    proc = subprocess.Popen([
        app_path + app,
        "--read-pbf", pbf_file,
        "--bounding-box",
        "top=%d" % (tile_lat+1),
        "left=%d" % (tile_lng),
        "bottom=%d" % (tile_lat),
        "right=%d" % (tile_lng+1),
        "--write-pbf", "someotherfile.osm.pbf"
        ], cwd=app_path, shell=True)
    # Poll the proc to see if it is finished
    while proc.returncode is None:
        proc.communicate()
        proc.poll()
    print(">> Terminated\n")

if __name__ == "__main__":
    print("Args were: " + str(sys.argv) + "\n")
    create_tile_pbf("./somefile.osm.pbf", 7, 46)

我尝试了使用和不使用shell=True,我尝试将所有参数连接到一个字符串中。但是我在执行时总是遇到这个错误:

Nov 03, 2017 2:26:28 PM org.openstreetmap.osmosis.core.Osmosis main
SEVERE: Execution aborted.
org.openstreetmap.osmosis.core.OsmosisRuntimeException: Expected argument 1 to be an option or task name.
        at org.openstreetmap.osmosis.core.cli.CommandLineParser.parse(CommandLineParser.java:79)
        at org.openstreetmap.osmosis.core.Osmosis.run(Osmosis.java:74)
        at org.openstreetmap.osmosis.core.Osmosis.main(Osmosis.java:37)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launchStandard(Launcher.java:330)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:238)
        at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
        at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
        at org.codehaus.classworlds.Launcher.main(Launcher.java:47)

但是当使用 Powershell 或命令提示符运行命令时,它就像一个魅力。

.\osmosis.bat --read-pbf .\somefile.osm.pbf --bounding-box top=47 left=7 bottom=46 right=8 --write-pbf someotherfile.osm.pbf

我正在运行 Windows 10 1703 64 位和 Anaconda 4.3.30。

【问题讨论】:

  • 用 echo %1 %2 创建你自己的 osmosis.bat ... 看看它是如何被调用的。

标签: java python subprocess osmosis


【解决方案1】:

您的脚本和命令提示符交互之间的区别是osmosis/bin/osmosis.bat.\osmosis.bat。由于您对Popen() 的调用已包含cwd 选项,因此您无需再次指定目录。这意味着你的电话应该是:

proc = subprocess.Popen([
    app,                                    # <== No app_path here
    "--read-pbf", pbf_file,
    "--bounding-box",
    "top=%d" % (tile_lat+1),
    "left=%d" % (tile_lng),
    "bottom=%d" % (tile_lat),
    "right=%d" % (tile_lng+1),
    "--write-pbf", "someotherfile.osm.pbf"
    ], cwd=app_path, shell=True)           # <== because of this cwd 

【讨论】:

  • 是的,这解决了它。我已经尝试过了,但我不得不将我的应用程序更改为 .\osmosis.bat 而不仅仅是 osmosis.bat
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
  • 1970-01-01
  • 2018-07-30
  • 2012-10-31
相关资源
最近更新 更多