2012-10-31 35 views
15

Tôi đang sử dụng pycallgraph từ dòng lệnh vào tiểu sử và vẽ biểu đồ cuộc gọi của một chương trình tương đối đơn giản. Tuy nhiên, ảnh kết quả bao gồm các nội bộ của các thư viện chuẩn (luồng, json, socket) mặc dù tôi không sử dụng tùy chọn dòng lệnh -s. Sử dụng tùy chọn -e để loại trừ các mô-đun đó không có hiệu lực và sử dụng kết quả -i trong biểu đồ cuộc gọi trống. Tôi cũng đã thử cProfile, nhưng nó chỉ vẽ đồ thị chủ đề chính.Làm thế nào để ngăn chặn pycallgraph từ vào chức năng thư viện tiêu chuẩn?

Làm thế nào tôi có thể làm cho pycallgraph chỉ hiển thị các cuộc gọi trong mã của tôi? Kết quả lộn xộn hiện tại là vô dụng.

Chỉnh sửa: Tôi đang sử dụng 0.5.1, khả dụng qua easy_install. Chạy pycallgraph ./cursesclient.py kết quả đầu ra này: a messy call graph. Như bạn có thể thấy, pycallgraph hiển thị phần bên trong của các mô-đun json, re, encodings, socket và luồng. Re và mã hóa không bao giờ được gọi trực tiếp trong mã của tôi, nhưng thông qua json và socket, tương ứng.

+0

anyways, cảm ơn đã chỉ cho tôi tại pycallgraph. –

+0

bạn sử dụng phiên bản nào? Trong 0.5.1, tôi có thể tạo biểu đồ chỉ với các hàm của tôi, chỉ cần gọi 'pycallgraph mycode.py', nhưng tùy chọn '-s' bỏ qua một số mô-đun như 'functools' – adray

Trả lời

5

pycallgraph có một phương thức stop_trace() không có giấy tờ mà bạn có thể sử dụng để loại trừ các phần mã. Một cái gì đó như

import pycallgraph 
import mycode 
import stuff_i_dont_want_to_see 

pycallgraph.start_trace() 
#Initializations 

pycallgraph.stop_trace() 
stuff_i_dont_want_to_see() 
pycallgraph.start_trace() 

mycode.things() 
pycallgraph.make_dot_graph('cleaner_graph.png') 

Đó có phải là những gì bạn đang theo dõi không?

source

+2

. tất cả các cuộc gọi thư viện chuẩn để tránh vẽ đồ thị và lược tả chúng; đặc biệt là vì theo lệnh dòng lệnh của pycallgraph, nó không nên vẽ đồ thị theo mặc định. Tuy nhiên, vì đã gần một tháng tôi sẽ chấp nhận câu trả lời của bạn khi không có lựa chọn thay thế tốt hơn. – andyn

10

Pycallgraph cung cấp khả năng lọc để lọc ra bất kỳ mô-đun, lớp học hoặc chức năng bạn muốn loại trừ từ đồ thị cuộc gọi. chức năng sau đây cần được định nghĩa trước khi bạn bắt đầu theo dõi và truyền cho pycallgraph

Ví dụ

def filtercalls(call_stack, modul, clas, func, full): 
    mod_ignore = ['shutil','scipy.optimize','re','os','sys','json'] 
    func_ignore = ['CustomFunctionName','pdbcall'] 
    clas_ignore = ['pdb'] 
    return modul not in mod_ignore and func not in func_ignore and clas not in clas_ignore 

Các pycallgraph dấu vết bắt đầu là

pycallgraph.start_trace(filter_func=filtercalls) 

Bằng cách này, bất kỳ mô-đun, lớp học hoặc hoạt động mà bạn cung cấp trong bộ lọc sẽ bị xóa. Xin lưu ý rằng nhiều thời gian trong thư viện chuẩn chỉ cung cấp tên mô-đun là không đủ. Vì vậy, bao gồm cả numpy trong mod_ignore vẫn sẽ dẫn đến numpy.core được bao gồm

+3

Nên được cho là câu trả lời chính xác vì nó làm những gì OP hỏi, hạn chế luồng ví dụ có thể thậm chí không có thể mà không loại bỏ trường hợp Thread của riêng bạn cũng như sử dụng câu trả lời 'đúng' – CrackerJack9

Các vấn đề liên quan