使用子进程向 运行 发出来自 Python 的 PDAL bash 命令
Issue using subprocess to run a PDAL bash command from Python
问题:
我无法使用 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 没有为当前问题提供足够明确的答案。
这里有多个错误。
- 您正在使用未定义的变量
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))
问题:
我无法使用 subprocess
.
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 没有为当前问题提供足够明确的答案。
这里有多个错误。
- 您正在使用未定义的变量
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))