проверить модуль с скомпилированными файлами python

У меня есть два файла 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, возникает ошибка

Трассировка (последний последний вызов): файл «caller.py», строка 73, в

Файл caller.py, строка 71, в caller

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

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

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

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


person Kakarot    schedule 26.06.2018    source источник


Ответы (1)


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

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

person Matteo Barbieri    schedule 26.06.2018
comment
Привет, спасибо за ответ! Но это кажется противоречащим тому, как работает import. import соответствующим образом импортирует из pyc файлов, находящихся в каталоге compiled. - person Kakarot; 26.06.2018
comment
Нет, import по-прежнему следует правилу, которое я написал выше. Также я должен сказать, что немного странно (насколько мне известно) хранить скомпилированные файлы в другой папке, поскольку обычно это просто оптимизация (они перекомпилируются каждый раз, когда вы что-то меняете в исходном файле). - person Matteo Barbieri; 26.06.2018
comment
Кроме того, самое первое сообщение об ошибке, которое вы получаете, похоже, подразумевает, что используется файл caller.py... - person Matteo Barbieri; 26.06.2018
comment
Спасибо за ответ! Я попытался добавить операторы отладки (печать) в файлы py. Оператор импорта импортирует из pyc файлов, а не из py файлов. Кроме того, причина, по которой я спрашиваю об этом, заключается в том, что у меня есть egg с pyc файлами. Яйцо добавляется в path, но есть также соответствующие файлы py (более старые версии с меньшим количеством строк), находящиеся вне яйца. Я сталкиваюсь с той же ошибкой, когда файл внутри яйца выполняет inspect.stack() - person Kakarot; 26.06.2018