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.pyimport 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.pyimport 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