2014-08-29 2 views
1

Я пытаюсь получить доступ к коду, который выполняется модулем при его вводе.Код модуля python доступа

Визуализация источника или редактирование здесь не вопрос. Я хотел бы знать, где хранятся эти инструкции.

Пример

module.py

def func(): 
    print 'func' 

print 'module' 

консоль Python

>>> import module 
module 
>>> import dis 
>>> dis.dis(module) 
Disassembly of func: 
0 LOAD_CONST    1 ('func') 
3 PRINT_ITEM   
4 PRINT_NEWLINE  
5 LOAD_CONST    0 (None) 
8 RETURN_VALUE   
>>> dir(module) 
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'func'] 

Где я могу найти <function> объект, или func_code или любые которая хранит print 'module' инструкция?

+1

@pokoli, это не относится - это не кейн, он пытается получить доступ к байт-коду. – Phillammon

+1

'print 'module'' не существует ни в одном объекте. Он выполняется, когда модуль определен, но не является * частью * модуля. Существует различие между файлом, который содержит код, определяющий модуль, и объект 'module', который является результатом выполнения этого файла. – chepner

+0

@chepner: О, хорошо спасибо! поэтому, если я хочу пойти глубже, должен ли я открыть другой вопрос: как подключить встроенный импорт, чтобы получить трассировку кода, выполняемого при импорте? (Я новичок в SO) – Centime

ответ

0

From the documentation:

dis.dis ([bytesource])

Разберите объект bytesource. bytesource может обозначать либо модуль, класс, метод, функцию, либо объект кода. Для модуля он разбирает все функции.

Поскольку module.py является модулем, он разбирает все функции в модуле. Поскольку вызов «print» module «» не находится в функции, он не разбирается.

EDIT:

Чтобы ответить на этот актуальный вопрос (извините об этом), так как оператор вызывается при импорте сам модуль, я уверен, что вы можете решить эту проблему следующим образом (хотя это немного ужасно, как и решение идти, и там, наверное, лучший способ сделать это):

class importer(): 
    def import_module(): 
     import module 
dis.dis(importer) 

что является небольшим злоупотреблением как дис работает, но эй, это, кажется, работает.

+1

Это отвечает на вопрос * «Почему' dis.dis' не показывает команду 'print' *, но ** не ** *« где я могу найти ... »*. – jonrsharpe

+0

Итак, возможно, dis.dis не является подходящим инструментом для работы, но есть ли другой, который позволил бы мне получить доступ к этой инструкции «print 'module»? edit: как jonrsharpe сказал 20s передо мной – Centime

+0

@jonrsharpe Лучше? – Phillammon