【问题标题】:subprocess how to use command when shell = False当shell = False时子进程如何使用命令
【发布时间】:2016-10-25 14:25:06
【问题描述】:

我可以运行这段代码:

subprocess.call(" ./ApiStreamingClient.py -w flow-index -n admin -p admin localhost 1477389500000000000 1477389900000000000 | gzip - > out2.gz", shell=True)

但我想通过选项shell=False 分两步运行它。我怎样才能做到这一点?我找不到任何简单的例子。

我认为我需要将命令拆分为由| 分隔的两部分,但我不明白如何。

【问题讨论】:

  • 您到底想通过拆分解决什么问题?拆分它需要您接收ApiStreamingClient.py 的输出并将其发送到gzip
  • 注意:我可能错了,但我相信在 shell 中运行它的一件事就是处理可执行解析,所以当你这样做 ./ 时,你需要传递整个python 可执行文件的路径,然后将 .py 文件作为参数并使用 gzip 的完整路径,但我可能又错了。
  • 1477389500000000000 1477389900000000000 是一个区间的开始和结束时间。我需要运行一个 for 循环,在几个子间隔中重复该命令
  • @TadhgMcDonald-Jensen:你没看错,这是一个很好的观点。

标签: python shell subprocess


【解决方案1】:

我会这样做:

import gzip
import subprocess
import sys

command = [
    sys.executable,
    'ApiStreamingClient.py',
    '-w', 'flow-index',
    '-n', 'admin',
    '-p', 'admin',
    'localhost',
    '1477389500000000000',
    '1477389900000000000',
    ]
text = subprocess.check_output(command)
with gzip.open('out2.gz', 'w', 6) as outfile:
    outfile.write(text)

请注意,如果没有 shell,您不能只调用 Python 脚本作为可执行文件——您需要直接调用 python 并将脚本作为参数传递。但这很容易。

如果您想以流方式完成所有操作(例如,如果 text 占用过多内存),您可以使用 stdout=subprocess.PIPE 获取要读取的句柄,并将其传递给 shutil.copyfileobj() 而不是一次写text

【讨论】:

  • 您是否还需要提供python 可执行文件的完整路径?喜欢使用sys.executable 而不仅仅是'python'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 2018-09-05
  • 2019-11-21
  • 1970-01-01
  • 2021-09-18
相关资源
最近更新 更多