【问题标题】:Python; how to properly call another python script as a subprocessPython;如何正确调用另一个 python 脚本作为子进程
【发布时间】:2018-01-05 12:21:01
【问题描述】:

我知道已经有人问过一个非常相似的问题,但是由于there 发布的解决方案都没有解决我的问题,我尝试使其可复制:

所以我像这样调用this script to merge some shapefiles(一个文件夹中的所有文件):

shpfiles = 'shapefile_a.shp shapefile_b.shp'
subprocess.call(['python', 'shapemerger.py', '%s' % shpfiles])

我只从脚本中获得使用说明,所以我无法确定出了什么问题。如果我直接在终端中调用脚本,它就可以工作。 任何帮助表示赞赏。

【问题讨论】:

  • 使用 subprocess.run ,如果您使用的是 python 3+ 或对 python 3 和 python2 使用 subprocess.Popen 。试试这个:subprocess.Popen("python shapemerger.py {}".format(shpfiles), shell = True)
  • 将文件拆分为单独的名称['python', 'shapemerger.py'] + shpfiles.split()
  • @Stack 为什么shell=True 在这种情况下?
  • 您的形状文件作为唯一的参数传递,中间有空格。 VPfB 评论解决了它。使用参数列表,让子进程处理引用,你会没事的。

标签: python subprocess command-line-arguments


【解决方案1】:

每次启动程序时,它都会收到一个调用它的参数列表。这通常称为 argv(v 代表向量,即一维数组)。程序根据自己的调用语法解析这个列表,提取选项、参数、文件名等。

在命令行工作时,shell 负责解析输入行、启动一个或多个新程序并将其参数列表传递给它们。

当一个程序被另一个程序调用时,调用者负责提供正确的参数。它可以将这项工作委托给 shell。它的价格非常高。存在大量开销,并且可能存在安全风险!尽可能避免这种方法。

最后是问题本身:

shpfiles = 'shapefile_a.shp shapefile_b.shp'
subprocess.call(['python', 'shapemerger.py', '%s' % shpfiles])

这将调用python 来运行带有一个参数shapefile_a.shp shapefile_b.shp 的脚本shapemerger.py。该脚本需要文件名并接收这个名称。文件“shapefile_a.shp shapefile_b.shp”不存在,但脚本可能会在尝试访问该文件之前停止,因为它需要处理 2 个或更多文件。

正确的方法是将每个文件名作为一个参数传递。假设shpfiles 是一个空格分隔的列表:

subprocess.call(['python', 'shapemerger.py'] + shpfiles.split())

将生成一个包含 4 个项目的列表。请务必了解,如果文件名中有空格,此方法将失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多