使用子进程从 Python 运行 PDAL bash 命令的问题 [重复]

Posted

技术标签:

【中文标题】使用子进程从 Python 运行 PDAL bash 命令的问题 [重复]【英文标题】:Issue using subprocess to run a PDAL bash command from Python [duplicate] 【发布时间】:2019-01-27 13:29:56 【问题描述】:

问题:

我无法使用 subprocess 从 Python 运行 pdal bash 命令。

这里是代码

基于Running Bash commands in Python:

import os, subprocess

input = '/path/to/file.ply'
output = '/path/to/statfile.json'
if not os.path.isfile(output):
    open(output, 'a').close()

bashcmd = ("pdal info --boundary "
           +input
           +" > "
           +output
           )

print("Bash command is:\n\n".format(bashcmd))

process = subprocess.Popen(bashcommand.split(),
                           stdout=subprocess.PIPE,
                           shell=True)
    output, error = process.communicate()
    print("Output:\n\n".format(output))
    print("Error:\n\n".format(error))

这在 Python 控制台中给了我这个输出:

Bash command is:
pdal info --boundary /path/to/file.ply > /path/to/statfile.json

Output:
Usage:
  pdal <options>
  pdal <command> <command options>
  --command        The PDAL command
  --debug          Sets the output level to 3 (option deprecated)
  --verbose, -v    Sets the output level (0-8)
  --drivers        List available drivers
  --help, -h       Display help text
  --list-commands  List available commands
  --version        Show program version
  --options        Show options for specified driver (or 'all')
  --log            Log filename (accepts stderr, stdout, stdlog, devnull as
      special cases)
  --logtiming      Turn on timing for log messages

The following commands are available:
  - delta
  - diff
  - fauxplugin
  - ground
  - hausdorff
  - info
  - merge
  - pcl
  - pipeline
  - random
  - smooth
  - sort
  - split
  - tindex
  - translate

See http://pdal.io/apps/ for more detail

Error:
None

它看起来好像只在调用“pdal”之后停止读取命令的参数,这会打印此帮助消息。

如果我复制第一次打印的输出并将其粘贴到 bash 终端,它会正常工作,并为我提供包含所需元数据的输出文件。但是在 Python 中没有创建输出文件。

问题:

我想知道为什么(例如,重定向有什么问题,或者计算本身通常需要大约 20 秒?),以及如何从 Python 执行此命令?

This 没有为当前问题提供足够明确的答案。

【问题讨论】:

【参考方案1】:

这里有多个错误。

您使用的是未定义的变量bashCommand,而不是您在上面定义的变量bashcmd。 您正在使用 shell 重定向将输出混合到 Python 文件句柄。 您没有捕获进程的stderr。 (我会模糊地假设你不需要标准错误。) 如果您使用shell=True 运行该命令,则不应使用split()

更广泛地说,您可能应该避免使用shell=True,并让 Python 通过将输出连接到您打开的文件来为您处理重定向;而在现代,如果你可以使用subprocess.run()subprocess.check_call() 或朋友,你真的不应该使用subprocess.Popen()

import subprocess

input = '/path/to/file.ply'
output = '/path/to/statfile.json'

with open(output, 'a') as handle:
    bashcmd = ['pdal', 'info', '--boundary', input]

    #print("Bash command is:\n\n".format(bashcmd))

    result = subprocess.run(bashcmd, stdout=handle, stderr=subprocess.PIPE)

    # No can do because output goes straight to the file now
    ##print("Output:\n\n".format(output))
    #print("Error:\n\n".format(result.stdout))

【讨论】:

以上是关于使用子进程从 Python 运行 PDAL bash 命令的问题 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

导入pyspark ETL模块并使用python子进程作为子进程运行时出错

从python子进程运行rvls

使用 asyncio 将 bash 作为 Python 的子进程运行,但 bash 提示被延迟

使用 PDAL 的点云密度可视化

使用 python 子进程运行 GNU 并行命令

使用 python 子进程在实例上运行 gsutil - 访问权限?