Прежде всего, все, что вы передаете в subprocess.call
, должно быть строкой. Имена grep
, file
, tail
и cut
не определены в вашем коде, и вам нужно превратить все выражение в строку. Поскольку строка поиска для команды grep должна быть динамической c, вам необходимо создать последнюю строку перед передачей ее в качестве аргумента в функцию.
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.call
: shell=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))