我如何获得当前正在执行的文件的路径和名称?

我有脚本调用其他脚本文件,但我需要获取当前在该进程中运行的文件的文件路径。

例如,假设我有三个文件。 使用execfile:

  • script_1.py调用script_2.py
  • 反过来, script_2.py调用script_3.py
  • 我怎样才能获得的文件名和路径script_3.py ,从代码中script_3.py ,而不必传递信息,从参数script_2.py

    (执行os.getcwd()将返回原始的脚本文件路径,而不是当前文件。)


    p1.py:

    execfile("p2.py")
    

    p2.py:

    import inspect, os
    print inspect.getfile(inspect.currentframe()) # script filename (usually with path)
    print os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) # script directory
    

    __file__
    

    正如其他人所说的。 您可能还想使用os.path.realpath来消除符号链接:

    import os
    
    os.path.realpath(__file__)
    

    这是一个基于此线程中的答案的实验 - 在Windows上使用Python 2.7.10。

    基于堆栈的堆栈是唯一可以提供可靠结果的堆栈。 最后两个语法最短 ,即 -

    print os.path.abspath(inspect.stack()[0][1])                   # C:testpathlibscript3.py
    print os.path.dirname(os.path.abspath(inspect.stack()[0][1]))  # C:testpathlib
    

    这里将这些被添加到sys作为函数! 感谢@Usagi和@pablog

    基于以下三个文件,并使用python script1.py从其文件夹中运行script1.py(也尝试使用绝对路径执行execfiles并从单独的文件夹调用)。

    C: testpath script1.py:execfile('script2.py execfile('script2.py')
    C: testpath script2.py:execfile('lib execfile('lib/script3.py')
    C: testpath LIB script3.py:

    import sys
    import os
    import inspect
    
    print "Python " + sys.version
    print
    
    print __file__                                        # script1.py
    print sys.argv[0]                                     # script1.py
    print inspect.stack()[0][1]                           # lib/script3.py
    print sys.path[0]                                     # C:testpath
    print
    
    print os.path.realpath(__file__)                      # C:testpathscript1.py
    print os.path.abspath(__file__)                       # C:testpathscript1.py
    print os.path.basename(__file__)                      # script1.py
    print os.path.basename(os.path.realpath(sys.argv[0])) # script1.py
    print
    
    print sys.path[0]                                     # C:testpath
    print os.path.abspath(os.path.split(sys.argv[0])[0])  # C:testpath
    print os.path.dirname(os.path.abspath(__file__))      # C:testpath
    print os.path.dirname(os.path.realpath(sys.argv[0]))  # C:testpath
    print os.path.dirname(__file__)                       # (empty string)
    print
    
    print inspect.getfile(inspect.currentframe())         # lib/script3.py
    
    print os.path.abspath(inspect.getfile(inspect.currentframe())) # C:testpathlibscript3.py
    print os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) # C:testpathlib
    print
    
    print os.path.abspath(inspect.stack()[0][1])          # C:testpathlibscript3.py
    print os.path.dirname(os.path.abspath(inspect.stack()[0][1]))  # C:testpathlib
    print
    
    链接地址: http://www.djcxy.com/p/29027.html

    上一篇: How do I get the path and name of the file that is currently executing?

    下一篇: PSVersion is not recognized