У меня есть сценарий удара, который я использовал для среды Linux, но теперь я должен использовать его на платформе Windows и хотеть преобразовать сценарий удара в скрипт Python, который я могу запустить.
Сценарий удара довольно прост (я думаю), и я попытался преобразовать его Google путем вокруг, но не могу преобразовать его успешно.
Сценарий удара похож на это:
runs=5
queries=50
outfile=outputfile.txt
date >> $outfile
echo -e "\n---------------------------------"
echo -e "\n----------- Normal --------------"
echo -e "\n---------------------------------"
echo -e "\n----------- Normal --------------" >> $outfile
for ((r = 1; r < ($runs + 1); r++))
do
echo -e "Run $r of $runs\n"
db2 FLUSH PACKAGE CACHE DYNAMIC
python reads.py -r1 -pquery1.sql -q$queries -shotelspec -k6 -a5 >> $outfile
done
Основная команда, Python read.py … и т.д. является другим файлом Python, мне дали и имею аргументы, как Вы видите.
Я знаю, что это много для просьбы, но это действительно выручило бы меня, если кто-то мог бы преобразовать это в сценарий Python, я могу использовать или по крайней мере дать мне некоторые подсказки и направления.
С уважением,
Mestika
Это - то, что я записал, но без успеха:
runs=5
queries=50
outfile=ReadsAgain.txt
file = open("results.txt", "ab")
print "\n---------------------------------"
print "\n----------- Normal --------------"
print "\n---------------------------------"
file.write("\n----------- Normal --------------\n")
print "\n------------- Query without Index --------------"
file.write("\n------------- Query without Index --------------\n")
for r = 1; r < (%s + 1); r++ % runs
print "Run %s of %s \n" % r % runs
db2 FLUSH PACKAGE CACHE DYNAMIC
output = python reads.py -r1 -pquery1.sql -q$queries -shotelspec -k6 -a5
file.write(output)
file.close()
Перенести вашу программу должно быть довольно просто. Единственная сложная часть - это запуск команды db2 и (возможно) рефакторинг reads.py, чтобы его можно было вызывать как библиотечную функцию.
Основная идея та же:
echo
на print
. для r в диапазоне (прогоны):
.
с помощью модуля datetime . db2
модулем подпроцесса . import reads.py
для использования в качестве библиотеки (или вы можете использовать подпроцесс). Но, как говорит Марсело, если вам нужна дополнительная помощь, вам лучше приложить собственные усилия, чтобы задавать прямые вопросы.
Как бы я ни выступал за то, чтобы писать на Python, а не на bash, если единственная причина преобразования в Python заключается в том, что вы можете запустить его на Windows, имейте в виду, что вы можете установить bash на Windows и запустить его как есть. На сайте Cygwin.com есть полная реализация многих команд Unix.
Давайте разберем это на части. Особенно те вещи, которые вы ошиблись. :)
outfile = ReadsAgain.txt
Неудивительно, что вам нужно заключать строки в кавычки. С другой стороны, вы можете поместить пробелы вокруг =
для удобства чтения.
outfilename = "ReadsAgain.txt"
str.format
(или операция %
) python reads.py
-q $ query
Итак, вы уже знаете, как выполнить перенаправление, но как выполнить расширение переменной? Вы можете использовать формат формат
метод (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 <($ run + 1); r ++)) do done
Цикл в Python отличается от итерации в стиле C.В Python происходит итерация по итерируемому объекту, например по списку. Здесь вы пытаетесь сделать что-то запускается
раз, поэтому вы должны сделать это:
for r in range(runs):
#loop body here
диапазон (запускается)
эквивалентен [0,1, ..., запускается- 1]
, список из прогонов = 5
целочисленных элементов. Таким образом, вы будете повторять пробежек
раз. В каждом цикле r
назначается следующий элемент списка. Таким образом, это полностью эквивалентно тому, что вы делаете в Bash.
Если вы чувствуете смелость, используйте вместо него xrange
. Он полностью эквивалентен, но использует более продвинутые языковые функции (поэтому его сложнее объяснить непрофессиональным языком), но потребляет меньше ресурсов.
«Более сложная» часть, если хотите: выполнение программы и получение ее вывода. Google спешит на помощь! Очевидно, что самый популярный вопрос - это вопрос о переполнении стека: этот . Вы можете скрыть всю сложность, стоящую за этим, с помощью простой функции:
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 $ query -shotelspec -k6 -a5 >> $ outfile
становится:
command = "python reads.py -r1 -pquery1.sql -q%s -shotelspec -k6 -a5" % queries
read_result = get_output_of(command)
подпроцесс
, батареи включены Необязательно, учтите, что вы можете получить почти такой же результат 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 ...
Это должно выглядеть ужасно по сравнению с относительно простым и коротким сценарием Bash, верно? Python не является специализированным языком: он нацелен на то, чтобы делать все достаточно хорошо, но он не построен непосредственно для запуска программ и получения их результатов.
Тем не менее, вы бы обычно не писали движок базы данных на Bash, верно? Это разные инструменты для разных работ. Здесь, если вы не планируете вносить некоторые изменения, которые было бы нетривиально писать на этом языке, [Ba] sh определенно был правильным выбором.