2016-10-07 3 views
0

Цель: Профилирование скрипта Python с Pyflame в другом скрипте Python.Получение ошибок при попытке запуска Pyflame внутри скрипта Python

Подробности: Код запускается на виртуальной машине с Ubuntu 14.04 LTS.

1) Для того, чтобы запустить профилированный сценарий, я использую:

process = subprocess.Popen(["python", "python_script.py"]) 

2) Тогда я пытаюсь прикрепить Pyflame к процессу (относиться к этой линии, как тест дыма):

subprocess.Popen(["sudo pyflame -s 60 -r 0.0001 " + str(process.pid)], 
         shell=True) 

Проблема: Без sudo в приведенном выше описании Я получаю ошибку Failed to attach to PID ...: Operation not permitted.

С sudo Я получаю Failed to locate libpython named libpython2.7.so.

Я был бы признателен за любые идеи относительно того, как сделать заявление 2) работать с sudo или без него!

ответ

1

Видимо, Pyflame возвращает вторую ошибку, которую Вы получили, если соблюдены следующие условия:

  • Вы скомпилирован Pyflame для Python 2.X.
  • Вы пытаетесь профилировать скрипт, запущенный под интерпретатором Python 3.X.

Посмотрите на исходный код Pyflame here и here. Когда вы запускаете Pyflame, он просматривает пространство памяти вашего интерпретатора и пытается найти libpython2.7.so. Для интерпретатора Python 3.X библиотеки там нет.

Так что я предлагаю вам попробовать следующее:

  1. Выполните следующую команду. Вы подтвердите, правильно ли загружена библиотека в вашем интерпретаторе. cat /proc/{YOUR_PID}/maps | grep libpython2.7
  2. Если это не так, то необходимо учитывать следующее:
    1. Может быть, вы профилированного неправильный процесс (т.е. это не процесс, Python).
    2. Возможно, это процесс Python 3.X, и в этом случае вам нужно будет скомпилировать Pyflame для целевой Python 3.X.

Чтобы настроить таргетинг на Python 3.X при компиляции Pyflame, обратитесь к документации. Подсказке: вам необходимо изменить вызов ./configure следующим образом:

./configure --with-python=python3 

Кроме того, если у вас есть проблемы, делая python3 признанных в качестве библиотеки в вашей среде, вы должны будете симлинка на исполняемый файл интерпретатора Python 3.X.Это немного выходит за рамки, поэтому вы можете проверить мой личный блог за более подробной информацией (см. Сообщение «Использование Pyflame и журналов Uber для решения проблем масштабирования»). Отказ от ответственности: Я автор этого сообщения.

+0

Это был не Python 3, но, возможно, это был другой интерпретатор (PyPy, я думаю). Благодаря! Я больше не работаю над этим кодом, но если я где-нибудь рядом, я попробую. (И, может быть, этот ответ помогает кому-то другому.) – Takatam

Смежные вопросы