python - 难以通过 python 使用 qhull 管道

标签 python linux subprocess pipe qhull

我在通过 python 中的 QHull 传递命令时遇到问题。我目前正在尝试这样做:

input_command = "rbox c " + str(qpoints) + " | qconvex FQ FV n"
command = subprocess.Popen(input_command.split(" "), stdout=subprocess.PIPE)
print command.communicate()[0]

这里,qpoints 被格式化,因此 input_command 结束为:

rbox c P0,0,0 P0,0,2 P0,2,0 P0,2,2 P2,0,0 P2,0,2 P2,2,0 P2,2,2 | qconvex FQ FV n

不幸的是,这只是打印出 qconvex 的用法:

qconvex- compute the convex hull.  Qhull 2012.1 2012/02/18
    input (stdin): dimension, number of points, point coordinates
    comments start with a non-numeric character

options (qconvex.htm):
    Qt   - triangulated output
    QJ   - joggled input instead of merged facets
    Tv   - verify result: structure, convexity, and point inclusion
    .    - concise list of all options
    -    - one-line description of all options

output options (subset):
    s    - summary of results (default)
    i    - vertices incident to each facet
    n    - normals with offsets
    p    - vertex coordinates (includes coplanar points if 'Qc')
    Fx   - extreme points (convex hull vertices)
    FA   - report total area and volume
    FS   - compute total area and volume
    o    - OFF format (dim, n, points, facets)
    G    - Geomview output (2-d, 3-d, and 4-d)
    m    - Mathematica output (2-d and 3-d)
    QVn  - print facets that include point n, -n if not
    TO file- output results to file, may be enclosed in single quotes

examples:
    rbox c D2 | qconvex s n                    rbox c D2 | qconvex i
    rbox c D2 | qconvex o                      rbox 1000 s | qconvex s Tv FA
    rbox c d D2 | qconvex s Qc Fx              rbox y 1000 W0 | qconvex s n
    rbox y 1000 W0 | qconvex s QJ              rbox d G1 D12 | qconvex QR0 FA Pp
    rbox c D7 | qconvex FA TF1000

我已经在线阅读了一些在 python 调用中包含管道时必须采取的额外步骤的示例。但我无法让他们的任何例子发挥作用,而且几乎没有关于发生了什么的解释。有人可以在这里向我解释一个有效的代码片段以及它为什么有效吗?

我也试过从文件中读取一个函数的结果。例如,我尝试从文件中读取 rbox 的结果:

python 代码:

input_command =  "qconvex FQ FV n < rbox.txt"
    command = subprocess.Popen(input_command.split(" "), shell=True)
    result = command.communicate()
    return result

数据:

3 rbox c P1,1,1 P1,1,3 P1,3,1 P1,3,3 P3,1,1 P3,1,3 P3,3,1 P3,3,3
16
     1      1      1 
     1      1      3 
     1      3      1 
     1      3      3 
     3      1      1 
     3      1      3 
     3      3      1 
     3      3      3 
  -0.5   -0.5   -0.5 
  -0.5   -0.5    0.5 
  -0.5    0.5   -0.5 
  -0.5    0.5    0.5 
   0.5   -0.5   -0.5 
   0.5   -0.5    0.5 
   0.5    0.5   -0.5 
   0.5    0.5    0.5 

不过,这仍然只是打印出 QConvex 描述。奇怪的是,这在命令行中运行得非常好,而不是通过 python。即使我不能让管道工作,我也绝对需要从文件中读入才能工作。有谁知道进行此函数调用的诀窍是什么?

最佳答案

  • 如果您使用 | 等 shell 功能或使用纯 Python 重写命令,请使用 shell=True,请参阅 Replacing shell pipeline
  • if 您使用 shell=True then 按照 the docs 中的指定将命令作为字符串传递
from subprocess import check_output as qx

output = qx("rbox c {qpoints} | qconvex FQ FV n".format(qpoints=qpoints),
            shell=True)
print output

关于python - 难以通过 python 使用 qhull 管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18565369/

相关文章:

python - 从用户处获取一组字母并从单独的词典文件中打印出有效单词的所有组合的程序

c++ - Ebpf:助手的 undefined symbol

Python 子进程 Popen.terminate() 仍然停留在 wait()

Python函数捕获子进程stdout和stderr到日志文件

python - 在 Scikit 中加载自定义数据集(类似于 20 个新闻组集)以对文本文档进行分类

Python numpy : "Array is too big"

python - 在 Raspberry Pi 重启时运行 Python3 模块

c++ - 在 LINUX C++ 中获取模块名称和进程名称

python - 无法使用 python 和 pyserial 打开/dev/ttyusb0

Python子进程: How can I execute a sub-process of a process in python?