在python下,获取当前执行主脚本的方法有两个:sys.argv[0]和__file__。
获取主执行文件路径的最佳方法是用sys.argv[0],它可能是一个相对路径,所以再取一下abspath是保险的做法,像这样:
import os,sysdirname, filename = os.path.split(os.path.abspath(sys.argv[0]))PRint "running from", dirnameprint "file is", filename
__file__ 是用来获得模块所在的路径的,这可能得到的是一个相对路径,比如在脚本test.py中写入:
#!/usr/bin/env python
print __file__
而在Python控制台下,直接使用print __file__是会导致 name ‘__file__’ is not defined错误的,因为这时没有在任何一个脚本下执行,自然没有 __file__的定义了。
在主执行文件中时,两者没什么差异,不过要是在不同的文件下,就不同了,下面示例:
C:/junk/so>type /junk/so/scriptpath/script1.pyimport sys, osprint "script: sys.argv[0] is", repr(sys.argv[0])print "script: __file__ is", repr(__file__)print "script: cwd is", repr(os.getcwd())import whereutilswhereutils.show_where() C:/junk/so>type /python26/lib/site-packages/whereutils.pyimport sys, osdef show_where(): print "show_where: sys.argv[0] is", repr(sys.argv[0]) print "show_where: __file__ is", repr(__file__) print "show_where: cwd is", repr(os.getcwd()) C:/junk/so>/python26/python scriptpath/script1.pyscript: sys.argv[0] is 'scriptpath//script1.py'script: __file__ is 'scriptpath//script1.py'script: cwd is 'C://junk//so'show_where: sys.argv[0] is 'scriptpath//script1.py'show_where: __file__ is 'C://python26//lib//site-packages//whereutils.pyc'show_where: cwd is 'C://junk//so'
所以一般来说,argv[0]要更可靠些。
新闻热点
疑难解答