Ответ
Давайте разбить его на куски. Особенно кусочки, которые вы ошиблись. :)
Назначение
outfile=ReadsAgain.txt
Неудивительно, что вам нужно заключать в кавычки строки. С другой стороны, у вас есть роскошь ставить пробелы вокруг =
для удобства чтения.
outfilename = "ReadsAgain.txt"
Расширение переменной → str.format
(или операция %
)
python reads.py <snip/> -q$queries <snip/>
Итак, вы уже знаете, как выполнить перенаправление, но как вы можете расширить переменную? Вы можете использовать метод format
(v2.6 +):
command = "python reads.py -r1 -pquery1.sql -q{0} -shotelspec -k6 -a5".format(queries)
Вы также можете использовать оператор %
:
#since queries is a number, use %d as a placeholder
command = "python reads.py -r1 -pquery1.sql -q%d -shotelspec -k6 -a5" % queries
for ((r = 1; r < ($runs + 1); r++)) do done
Цикл в Python отличается от итерации в стиле C. В Python происходит то, что вы перебираете итерируемый объект, например, список. Здесь вы пытаетесь сделать что-то runs
раз, поэтому вы должны сделать это:
for r in range(runs):
#loop body here
range(runs)
эквивалентно [0,1,...,runs-1]
, списку runs = 5
целочисленных элементов. Таким образом, вы будете повторять тело runs
раз. На каждом цикле r
назначается следующий элемент списка. Таким образом, это полностью эквивалентно тому, что вы делаете в Bash.
Если вы чувствуете смелость, используйте xrange
. Он полностью эквивалентен, но использует более продвинутые возможности языка (поэтому его сложнее объяснить в терминах непрофессионала), но потребляет меньше ресурсов.
Более сложная часть, если хотите: выполнение программы и получение ее результатов. Гугл на помощь! Очевидно, что главным хитом является вопрос переполнения стека: этот . Вы можете скрыть всю сложность за этим с помощью простой функции:
import subprocess, shlex
def get_output_of(command):
args = shlex.split(command)
return subprocess.Popen(args,
stdout=subprocess.PIPE).communicate()[0]
# this only returns stdout
Итак:
python reads.py -r1 -pquery1.sql -q$queries -shotelspec -k6 -a5 >> $outfile
становится:
command = "python reads.py -r1 -pquery1.sql -q%s -shotelspec -k6 -a5" % queries
read_result = get_output_of(command)
Не превышайте subprocess
, батареи включены
По желанию, учтите, что вы можете получить почти такой же вывод date
со следующим:
import time
time_now = time.strftime("%c", time.localtime()) # Sat May 15 15:42:47 2010
(Обратите внимание на отсутствие информации о часовом поясе. Это должно быть предметом другого вопроса , если он важен для вас.)
Как должна выглядеть ваша программа
Окончательный результат должен выглядеть следующим образом:
import subprocess, shlex, time
def get_output_of(command):
#... body of get_output_of
#... more functions ...
if __name__ = "__main__":
#only execute the following if you are calling this .py file directly,
#and not, say, importing it
#... initialization ...
with file("outputfile.txt", "a") as output_file: #alternative way to open files, v2.5+
#... write date and other stuff ...
for r in range(runs):
#... loop body here ...
Post scriptum
Это должно выглядеть довольно ужасно по сравнению с относительно простым и коротким скриптом Bash, верно? Python не является специализированным языком: он нацелен на то, чтобы делать все достаточно хорошо, но не предназначен для непосредственного запуска программ и получения их результатов.
Тем не менее, вы бы обычно не написали бы движок базы данных на Bash, верно? Это разные инструменты для разных работ. Здесь, если вы не планируете вносить какие-либо изменения, которые было бы нетривиальным для написания на этом языке, [Ba] sh был определенно правильным выбором.