使用已编译的python文件检查模块

时间:2018-06-26 15:24:02

标签: python python-2.7 inspect

我有两个文件caller.py和callee.py

caller.py

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

caller()

callee.py

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

现在,我同时编译了caller.pycallee.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,位于呼叫者中

     

fn中第4行的文件“ callee.py”

     

文件“ /usr/local/Cellar/python@2/2.7.15/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py”,第1062行,在堆栈中       返回getouterframes(sys._getframe(1),上下文)    在getouterframes中的文件“ /usr/local/Cellar/python@2/2.7.15/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py”,行1040       framelist.append((frame,)+ getframeinfo(frame,context))    getframeinfo中的文件“ /usr/local/Cellar/python@2/2.7.15/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py”,行1015       行,lnum = findsource(frame)    findsource中的文件“ /usr/local/Cellar/python@2/2.7.15/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py”,行579       如果pat.match(lines [lnum]):中断   IndexError:列表索引超出范围

看起来好像inspect正在尝试从源文件.py中读取,即使它位于另一个目录中也是如此。 当我导航到其他目录时,似乎没有发生此错误。

对此有何解释? inspect.stack()是否在当前工作目录中查找等效的文件名(caller.pyc)py

1 个答案:

答案 0 :(得分:0)

Python会根据其PATH寻找合适的模块,并且查找它们的第一位是启动程序时所在的文件夹。

如果您希望解释器忽略原始源文件,请移至.pyc文件所在的目录并使用python caller.pyc启动脚本