Преобразование сценария удара к Python (маленький сценарий)

У меня есть сценарий удара, который я использовал для среды 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()
10
задан badp 16 May 2010 в 18:26
поделиться

3 ответа

Перенести вашу программу должно быть довольно просто. Единственная сложная часть - это запуск команды db2 и (возможно) рефакторинг reads.py, чтобы его можно было вызывать как библиотечную функцию.

Основная идея та же:

  • Установка локальных переменных такая же.
  • Замените echo на print .
  • Замените цикл на для r в диапазоне (прогоны): .
  • Получите дату с помощью модуля datetime .
  • Заменить запись в файл модулем файловых объектов .
  • Замените вызов db2 модулем подпроцесса .
  • Вам потребуется import reads.py для использования в качестве библиотеки (или вы можете использовать подпроцесс).

Но, как говорит Марсело, если вам нужна дополнительная помощь, вам лучше приложить собственные усилия, чтобы задавать прямые вопросы.

8
ответ дан 3 December 2019 в 13:44
поделиться

Как бы я ни выступал за то, чтобы писать на Python, а не на bash, если единственная причина преобразования в Python заключается в том, что вы можете запустить его на Windows, имейте в виду, что вы можете установить bash на Windows и запустить его как есть. На сайте Cygwin.com есть полная реализация многих команд Unix.

1
ответ дан 3 December 2019 в 13:44
поделиться

Ответ

Давайте разберем это на части. Особенно те вещи, которые вы ошиблись. :)


Назначение

 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

Цикл в стиле C → Цикл в объектно-ориентированном стиле

 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 ...

Post scriptum

Это должно выглядеть ужасно по сравнению с относительно простым и коротким сценарием Bash, верно? Python не является специализированным языком: он нацелен на то, чтобы делать все достаточно хорошо, но он не построен непосредственно для запуска программ и получения их результатов.

Тем не менее, вы бы обычно не писали движок базы данных на Bash, верно? Это разные инструменты для разных работ. Здесь, если вы не планируете вносить некоторые изменения, которые было бы нетривиально писать на этом языке, [Ba] sh определенно был правильным выбором.

33
ответ дан 3 December 2019 в 13:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: