1).python获取当前运行的类名函数名
import inspect def get_current_function_name(): return inspect.stack()[1][3] class MyClass: def function_one(self): print "%s.%s invoked"%(self.__class__.__name__, get_current_function_name()) if __name__ == "__main__": myclass = MyClass() myclass.function_one()
动态获取当前运行的函数名很方便,特别是对于一些debug系统来说
2).获取脚本名(三种方式)
import os,sys,inspect def path(): return inspect.getfile(sys.modules[__name__]) def path2(): return inspect.getfile(inspect.currentframe()) def path3(): return inspect.stack()[1][1] print path() print path2() print path3()
打印结果:
34.py
34.py
34.py
分——割——————线——————————————————————
以下三个py文件是有联系的,后面一个引用前面一个中的相关函数,测试顺序pathtest.py-->aaa.py-->test01.py,通过它们的打印结果,可以印证python获取路径的三种情况。
|---bin |---test01.py |---src |---aaa.py |---testcase |---group01 |---pathtest.py
Python获取路径的三种情况:获取函数定义所在脚本路径,获取调用函数脚本所在路径,获取启动Python解释器脚本所在路径。最常用的方式就是pathtest.py中current_path中获取路径的方式。
inspect.getfile(inspect.currentframe())和inspect.stack()[0][1]得到的是定义该函数的脚本文件的路径,包含脚本名称
inspect.stack()[1][1]得到的是调用该脚本的脚本文件的路径,包含脚本名称
os.path.dirname(os.path.realpath(sys.argv[0]))得到的是执行python x.py命令时,脚本参数x.py(也就是argv[0])所在路径
os.path.dirname(os.path.realpath(sys.path[0])),根据sys.path[0],sys.path[1],sys.path[2]取不同的值,获取调用函数脚本所在路径或者获取启动Python解释器脚本所在路径
1. pathtest.py
获取脚本路径(五种方式):
cd /soft/testcase/group01
vim pathtest.py
#coding:utf-8 import os,sys,inspect def path(): dir = inspect.getfile(sys.modules[__name__]) return os.path.abspath(os.path.dirname(dir)) def path1(): dir = os.path.realpath(sys.argv[0]) if os.path.isfile(dir): path=os.path.dirname(dir) return os.path.abspath(path) def path2(): this_file = inspect.getfile(inspect.currentframe())#得到定义该函数的脚本路径 return os.path.abspath(os.path.dirname(this_file)) def script_path(): caller_file = inspect.stack()[0][1]#stack()[0][1]得到定义该函数的脚本路径,stack()[1][1]获取调用该函数的脚本所在路.径 return os.path.abspath(os.path.dirname(caller_file)) def current_path(): dir = os.path.realpath(sys.path[0]) if os.path.isfile(dir): path=os.path.dirname(dir) return os.path.abspath(path) else: caller_file=inspect.stack()[1][1] return os.path.abspath(os.path.dirname(caller_file)) #print path() #print path1() #print path2() #print script_path() #print current_path()
打印结果:
/soft/testcase/group01
/soft/testcase/group01
/soft/testcase/group01
/soft/testcase/group01
/soft/testcase/group01
2. aaa.py
cd /soft/src
vim aaa.py
import os import sys import inspect sys.path.append("../testcase/group01") import pathtest def caller_func(): caller_path=pathtest.script_path() return caller_path def def_func(): def_path=pathtest.path2() return def_path def real_func(): real_func=pathtest.path1() return real_func def curr_func(): cur_func=pathtest.current_path() return cur_func #print caller_func() #print def_func() #print real_func() #print curr_func()
打印结果:
/soft/testcase/group01
/soft/testcase/group01
/soft/src
/soft/src
3. test01.py
cd /soft/bin
vim test01.py
import os,sys,inspect sys.path.append("../src") import aaa def func_a(): return aaa.caller_func() def func_b(): return aaa.def_func() def func_c(): return aaa.real_func() def func_d(): return aaa.curr_func() print func_a() print func_b() print func_c() print func_d()
打印结果:
/soft/testcase/group01
/soft/testcase/group01
/soft/bin
/soft/src