2014-01-06 2 views
2

파이썬 추적을 켜면 파일 이름이 모듈과 소스 코드와 함께 제공됩니다.파이썬 추적에서 전체 경로 이름 찾기

파일 경로와 파일 이름을 표시 할 수 있습니까?

내가 사용하고 있습니다 : 예에서

-m trace -t 

아래 다른 디렉토리에 두 개의 서로 다른 account_bank_statement.py 파일이 있습니다. 나를 위해 일하는 것이 추적 모듈을 해킹 포함 할 Tracing fIle path and line number

답변 :

17 --- modulename: account_bank_statement, funcname: button_create_invoice 
18 account_bank_statement.py(329):   if context is None: 
19 account_bank_statement.py(333):   currency = self.read(cr, uid, ids, ['currency'])[0]['currency'] 
20 --- modulename: account_bank_statement, funcname: _currency 
21 account_bank_statement.py(107):   res = {} 
22 account_bank_statement.py(108):   res_currency_obj = self.pool.get('res.currency') 

이 (답) 질문의 중복입니다.

편집

아래에 AlFe의 대답을 기반으로하는 솔루션. 그것 관입이지만, 내가 무엇을 찾고 있는지 않습니다. 나는 모듈 이름을 떠나고 또한 경로명을 추가했다. 나는 OpenERP와 함께 일하고 있으며 종종 여러 위치에 동일한 모듈 이름이 정의되어있다.

정말 Alfe의 해결책의 세련미이므로이 답변을 게시하지 않았습니다. 그렇다면 자신의 답변에 투표하십시오.

(2) 다음과 같이 편집 로컬 경로에

(1) 복사 trace.py :

171 def modname(path): 
172  """Return a plausible module name for the patch.""" 
173 
174  base = os.path.basename(path) 
175  filename, ext = os.path.splitext(base) 
176  return filename 

593  def globaltrace_lt(self, frame, why, arg): 
594   """Handler for call events. 
595 
596   If the code block being entered is to be ignored, returns `None', 
597   else returns self.localtrace. 
598   """ 
599   if why == 'call': 
600    code = frame.f_code 
601    filename = frame.f_globals.get('__file__', None) 
602    if filename: 
603     # XXX modname() doesn't work right for packages, so 
604     # the ignore support won't work right for packages 
605     #modulename = fullmodname(filename) 
606     modfile, ext = os.path.splitext(filename) 
607     modulename = fullmodname(modfile) 
608     if modulename is not None: 
609      ignore_it = self.ignore.names(modfile, modulename) 
610      if not ignore_it: 
611       if self.trace: 
612        print (" --- modulename: %s, funcname: %s, filename: %s" 
613         % (modulename, code.co_name, filename)) 
614       return self.localtrace 
615    else: 
616     return None 

샘플 출력

참고 다른 디렉토리에 포함 된 2 개 개의 다른 모듈 이름이있다 , 동일한 파일 이름으로. 이 수정 된 * trace.py **이 처리합니다.

2 --- modulename: register_accounting, funcname: button_create_invoice, filename: /home/sean/unifield/utp729/unifield-wm/register_accounting/account_bank_statement.pyc 
3 account_bank_statement.py(329):   if context is None: 
4 account_bank_statement.py(333):   currency = self.read(cr, uid, ids, ['currency'])[0]['currency'] 
5 --- modulename: account, funcname: _currency, filename: /home/sean/unifield/utp729/unifield-addons/account/account_bank_statement.pyc 
6 account_bank_statement.py(107):   res = {} 
7 account_bank_statement.py(108):   res_currency_obj = self.pool.get('res.currency') 
+0

관련 항목 : http://stackoverflow.com/questions/14492837/pythons-trace-module-and-filepaths – Evert

+1

나는 중복 게시물에 답변했습니다. 잘하면 그것은 당신에게도 도움이 될 것입니다. – aquavitae

답변

2

trace.py의 패치가 허용되는 경우이 작업은 쉽습니다.

trace.py (내 경우에는 /usr/lib/python2.7/)을 로컬 디렉토리 (예 : 현재 디렉토리)에 복사 한 다음 해당 로컬 복사본에 modname(path) 함수를 패치하십시오. 이 함수는 모듈 경로에서 디렉토리를 제거하므로 패키지 정보가 손실됩니다. 원래는 하지 스트립 디렉토리를 위해

filename, ext = os.path.splitext(path) 

로 변경할 수 있습니다 라인

filename, ext = os.path.splitext(base) 

가 포함되어 있습니다.

./trace.py --trace t.py 같은 호출의 출력은 다음과 같습니다

--- modulename: t, funcname: <module> 
t.py(3): import mypackage.mymodule 
--- modulename: mypackage/__init__, funcname: <module> 
__init__.py(1): --- modulename: mypackage/mymodule, funcname: <module> 
mymodule.py(1): print 42 
42 
t.py(5): print 5 
5 
--- modulename: ./trace, funcname: _unsettrace 
trace.py(80):   sys.settrace(None) 

내가 패키지 mypackage에있는 모듈 mymodule.py를 가져 t.py라는 테스트 스크립트를 추적하고 있습니다 (그래서 이름이 ./mypackage/mymodule.py입니다) . 해당 모듈은 42를 인쇄 만하고 테스트 스크립트 자체는 5를 인쇄합니다.

문제가 해결 되었습니까?

편집 :

두 번째보기에서 나는 다른 패치를 제안합니다.

globaltrace_lt()에서 모듈 이름은 modname()을 호출하여 파생됩니다. 이 fullmodname()를 호출하는 패치 :

  modulename = fullmodname(filename) 

내가이 덜 방해 패치있을 것 같아요.

+0

안녕하세요 Alfe, 답변 해 주셔서 감사합니다. 문제를 해결해 주셔서 감사합니다. --ignore-module에는 이제 전체 경로가 포함되어야합니다. – ardochhigh

+0

글쎄, 그래, 그게 논리적 인 결과 야 그게 바람직 할까? – Alfe

+1

그러나 코드의 추가 검사시 다른 제안이 있습니다. 위의 대답에서 내 편집을 참조하십시오. – Alfe

관련 문제