осмотреть модуль с помощью скомпилированных файлов Python - PullRequest
0 голосов
/ 26 июня 2018

У меня есть два файла caller.py и callee.py

caller.py

## 
##     
##     
##     
##   
##   
##
##
##
from callee import fn
def caller():
  fn()

caller()

callee.py

import inspect
def fn():
  print inspect.stack()

Теперь я скомпилировал caller.py и callee.py, чтобы получить соответствующие файлы pyc и переместил их в новый каталог compiled. Это структура каталогов.

├── __init__.py
├── callee.py
├── caller.py
└── compiled
    ├── __init__.pyc
    ├── callee.pyc
    └── caller.pyc

Я изменил caller.py, чтобы удалить все комментарии, в результате чего: caller.py

from callee import fn
def caller():
  fn()

caller()

Когда я выполню python compiled/caller.pyc Это ошибка, брошенная

Traceback (последний вызов был последним): Файл "caller.py", строка 73, в

Файл "caller.py", строка 71, в вызывающей программе

Файл "callee.py", строка 4, в fn

Файл "/usr/local/Cellar/python@2/2.7.15/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", строка 1062, в стеке вернуть getouterframes (sys._getframe (1), context) Файл "/usr/local/Cellar/python@2/2.7.15/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", строка 1040, в getouterframes framelist.append ((frame,) + getframeinfo (frame, context)) Файл "/usr/local/Cellar/python@2/2.7.15/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", строка 1015, в getframeinfo строки, lnum = findource (frame) Файл "/usr/local/Cellar/python@2/2.7.15/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", строка 579, в findource if pat.match (lines [lnum]): break IndexError: индекс списка вне диапазона

Похоже, что inspect пытается прочитать из исходного файла .py, даже если он находится в другом каталоге. Эта ошибка, по-видимому, не возникает при переходе в другой каталог.

Чем это объясняется? Ищет ли inspect.stack () эквивалент файла (caller.pyc) py в текущем рабочем каталоге?

1 Ответ

0 голосов
/ 26 июня 2018

Python ищет подходящие модули на основе его PATH, и в первую очередь он ищет их в папке, в которой вы находитесь при запуске программы.

Если вы хотите, чтобы интерпретатор игнорировал исходные исходные файлы, перейдите в каталог, где находятся файлы .pyc, и запустите скрипт с python caller.pyc

...