Не могу понять, как вызвать cProfile внутри программы - PullRequest
2 голосов
/ 16 августа 2010

Извините за вопрос новичка, но я не могу понять cProfile (я действительно новичок в Python)

Я могу запустить его через свой терминал с помощью:

python -m cProfile myscript.py

Но мне нужно запустить его на веб-сервере, поэтому я бы хотел поместить команду в сценарий, на который она будет смотреть.Как бы я это сделал?Я видел вещи, использующие такие термины, как __init__ and __main__, но я не совсем понимаю, что это такое.

Я знаю, что это просто, я просто все еще пытаюсь выучить все, и я знаю, что кто-то это знает.

Заранее спасибо!Я ценю это.

1 Ответ

5 голосов
/ 16 августа 2010

Я думаю, вы видели такие идеи:

if __name__ == "__main__":
    # do something if this script is invoked
    # as python scriptname. Otherwise, gets ignored.

Что происходит, когда вы вызываете python для скрипта, этот файл имеет атрибут __name__, установленный в "__main__", если этофайл напрямую вызывается исполняемым файлом python.В противном случае (если он не вызывается напрямую) он импортируется.

Теперь вы можете использовать этот трюк в своих сценариях, если вам нужно, например, при условии, что у вас есть:

def somescriptfunc():
    # does something
    pass


if __name__ == "__main__":
    # do something if this script is invoked
    # as python scriptname. Otherwise, gets ignored.

    import cProfile
    cProfile.run('somescriptfunc()')

Это изменит ваш сценарий.При импорте его функции-члены, классы и т. Д. Могут использоваться как обычно.Когда запускает из командной строки, он профилируется.

Это то, что вы ищете?


Из комментариев, которые я собрал большеВозможно, это необходимо, поэтому здесь идет речь:

Если вы запускаете скрипт из изменений CGI, он имеет вид:

# do some stuff to extract the parameters
# do something with the parameters
# return the response.

Когда я говорю абстрактно, вы можете сделать это:

def do_something_with_parameters(param1, param2):
    pass

if __name__ = "__main__":
    import cProfile
    cProfile.run('do_something_with_parameters(param1=\'sometestvalue\')')

Поместите этот файл в путь Python.При запуске он сам профилирует функцию, которую вы хотите профилировать.

Теперь для вашего CGI-скрипта создайте скрипт, который будет:

import {insert name of script from above here}

# do something to determine parameter values
# do something with them *via the function*:
do_something_with_parameters(param1=..., param2=...)
# return something

Так что ваш cgi-скрипт просто станет маленькой оберткойдля вашей функции (которая в любом случае), и теперь ваша функция является самопроверкой.

Затем вы можете профилировать функцию, используя установленные значения на рабочем столе, вне рабочего сервера.

Вероятно, есть более аккуратные способы добиться этого, но это сработало бы.

...