如何在Python中使用子进程

问题描述 投票:0回答:3

我想在python中执行以下shell命令:grep 'string' file | tail -1 | cut -c 1-3

我尝试过:

import subprocess

i = 1
while i < 1070:
    file = "sorted." + str(i) + ".txt"
    string = "2x"
    subprocess.call(grep 'string' file | tail -1 | cut -c 1-3)
    i = i + 1

任何帮助将不胜感激。谢谢。

python subprocess
3个回答
0
投票

您的命令应以字符串形式提供。另外,如果要获取命令的输出,可以使用以下命令:

subprocess.run("grep 'string' file | tail -1 | cut -c 1-3", shell=True, capture_output=True, check=True)

其中capture_output(在Python3.7 +中有效)返回带有returncodestdoutstderr的对象,如果您的命令失败,check标志将引发异常。


0
投票

子进程期望参数为字符串或数组:

subprocess.call("grep '{}' {} | tail -1 | cut -c 1-3".format(string, file), shell=True)

shell=True是必要的,因为您正在使用特定于外壳的命令,例如管道。

但是,在这种情况下,用纯python实现整个程序可能要容易得多。

请注意,如果字符串或文件中包含空格或引号的任何特殊字符,该命令将不起作用,并且实际上可能会对系统造成各种不必要的影响。如果您需要它来处理这些简单的值以外的其他问题,请考虑使用纯Python解决方案,设置shell=False并将数组语法与手动管道一起使用,或以某种形式进行转义。


0
投票

首先,传递给subprocess.call的任何内容都应该是字符串。在代码中未定义名称grepfiletailcut,您需要将整个表达式转换为字符串。由于grep命令的搜索字符串应该是动态的,因此您需要先构造最终字符串,然后再将其作为参数传递给函数。

import subprocess

i = 1
while i < 1070:
    file = "sorted." + str(i) + ".txt"
    string = "2x"
    command_string = 'grep {0} {1} | tail -1 | cut -c 1-3'.format(string, file)
    subprocess.call(command_string)
    i = i + 1

您可能想向subprocess.callshell=True传递附加参数。该参数将确保命令通过外壳执行。

您的命令正在使用cut。您可能想要检索子流程的输出,因此更好的选择是创建一个新的流程对象,并使用subprocess.communicate进行输出捕获:

import subprocess

i = 1
while i < 1070:
    file = "sorted." + str(i) + ".txt"
    string = "2x"
    command_string = 'grep {0} {1} | tail -1 | cut -c 1-3'.format(string, file)

    p = subprocess.Popen(command_string, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdoutdata, stderrdata = p.communicate()

    # stdoutdata now contains the output of the shell commands and you can use it
    # in your program

    i = i + 1

编辑:这是有关如何根据注释中的要求将数据存储到文本文件中的信息。

import subprocess

outputs = []

i = 1
while i < 1070:
    file = "sorted." + str(i) + ".txt"
    string = "2x"
    command_string = 'grep {0} {1} | tail -1 | cut -c 1-3'.format(string, file)

    p = subprocess.Popen(command_string, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
    stdoutdata, stderrdata = p.communicate()

    # stdoutdata now contains the output of the shell commands and you can use it
    # in your program, like writing the output to a file.

    outputs.append(stdoutdata)

    i = i + 1


with open('output.txt', 'w') as f:
    f.write('\n'.join(outputs))
© www.soinside.com 2019 - 2024. All rights reserved.