Кажется, cProfile переопределяет нормальное значение `__file__`, как адаптировать? - PullRequest
3 голосов
/ 23 марта 2012

У меня есть программа, которая использует встроенный глобальный __file__ для предоставления пути к данным, связанным с программой, как в path_to_stuff = os.path.join(os.path.dirname(__file__),'stuff'). Проблема в том, что когда я запускаю это с python -m cProfile myprog, значение __file__ больше не является путем к myprog, а скорее (по-видимому) путем к модулю cProfile, где мои вещи определенно не являются.

Я прочитал руководство , искал здесь и ничего не вижу по этому поводу. Есть ли способ либо (a) заставить cProfile оставить __file__ в покое, либо (b) узнать во время выполнения, что я работаю под cProfile, чтобы я мог инициализировать путь литеральной строкой в ​​этом особом случае?

Редактировать: или, я полагаю, (с), есть ли лучший способ найти каталог, который всегда будет рядом с программой.py?

Ответы [ 2 ]

0 голосов
/ 23 января 2014

Я нашел решение для вас, если у вас все еще есть проблема.

path_to_stuff = os.path.join(path.dirname(path.realpath(sys.argv[0])), 'stuff')
0 голосов
/ 23 марта 2012

(б) кажется легко сделать. В вашем program.py проверьте значение __name__. Если вы запускаете программу напрямую, значение __name__ будет "__main__". Вместо этого значение будет другим, если вы запускаете его в cProfile.

Редактировать : Я не могу воспроизвести вашу проблему. Кажется, что cProfile не меняет значение __name__ или __file__, когда я его пробую. Вы также можете попробовать запустить профилировщик с вашим скриптом, вызвав cProfile.run()

...