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

我有脚本调用其他脚本文件,但我需要获取当前正在运行的文件的文件path。

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

  • script_1.py调用script_2.py
  • 反过来, script_2.py调用script_3.py

我怎样才能script_3.py代码script_3.py的文件名和path,而不必将这些信息作为来自script_2.py参数script_2.py

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

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__ 

正如别人所说的那样。 你也可以使用:

 import os os.path.realpath(__file__) 

我认为这是更清洁的:

 import inspect print inspect.stack()[0][1] 

并获得相同的信息:

 print inspect.getfile(inspect.currentframe()) 

其中[0]是堆栈中的当前帧(堆栈顶部),[1]是文件名称,增加在堆栈中向后

 print inspect.stack()[1][1] 

将是调用当前帧的脚本的文件名。 另外,使用[-1]会让你到堆栈的底部,原始的调用脚本。

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

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

 print os.path.abspath(inspect.stack()[0][1]) # C:\testpath\lib\script3.py print os.path.dirname(os.path.abspath(inspect.stack()[0][1])) # C:\testpath\lib 

这些是被添加到sys作为功​​能! 感谢@Usagi和@pablog

基于以下三个文件,并使用python script1.py从其文件夹中运行script1.py(也尝试使用绝对path执行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:\testpath\script1.py print os.path.abspath(__file__) # C:\testpath\script1.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:\testpath\lib\script3.py print os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) # C:\testpath\lib print print os.path.abspath(inspect.stack()[0][1]) # C:\testpath\lib\script3.py print os.path.dirname(os.path.abspath(inspect.stack()[0][1])) # C:\testpath\lib print 

如果您的脚本只包含一个文件,则标记为“最好”的build议全部为true。

如果你想从可以作为模块导入的文件中find可执行文件的名称(即传递给当前程序的python解释器的根文件),你需要这样做(让我们假设这是一个文件名为foo.py ):

import inspect

print inspect.stack()[-1][1]

因为栈上的最后一件事( [-1] )是第一件事(堆栈是LIFO / FILO数据结构)。

然后在文件bar.py中,如果你import foo它会打印bar.py ,而不是foo.py ,这将是所有这些的值:

  • __file__
  • inspect.getfile(inspect.currentframe())
  • inspect.stack()[0][1]
 import os os.path.dirname(__file__) # relative directory path os.path.abspath(__file__) # absolute file path os.path.basename(__file__) # the file name only 
 import os print os.path.basename(__file__) 

这只会给我们文件名。 即如果abspath的文件是c:\ abcd \ abc.py那么第二行将打印abc.py

“目前在进程中运行的文件的文件path”并不完全清楚你的意思。 sys.argv[0]通常包含Python解释器调用的脚本的位置。 检查sys文档以获取更多细节。

正如@Tim和@Pat Notz指出的那样,__file__属性提供了访问权限

如果从文件中加载,则从中加载模块的文件

我有一个脚本,必须在Windows环境下工作。 这段代码被剪掉了,我已经完成了:

 import os,sys PROJECT_PATH = os.path.abspath(os.path.split(sys.argv[0])[0]) 

这是一个相当黑客的决定。 但是它不需要外部库,这对我来说是最重要的。

__file__属性适用于包含主执行代码的文件以及导入的模块。

请参阅https://web.archive.org/web/20090918095828/http://pyref.infogami.com/__file__

 import sys print sys.path[0] 

这将打印当前正在执行的脚本的path

 import os os.path.dirname(os.path.abspath(__file__)) 

不需要检查或任何其他图书馆。

当我不得不导入一个脚本(从不同的目录,然后执行的脚本),这使用了一个configuration文件驻留在导入的脚本相同的文件夹。

我认为这只是__file__听起来像你也可能想检查检查模块 。

 import sys print sys.argv[0] 

这应该工作:

 import os,sys filename=os.path.basename(os.path.realpath(sys.argv[0])) dirname=os.path.dirname(os.path.realpath(sys.argv[0])) 

你可以使用inspect.stack()

 import inspect,os inspect.stack()[0] => (<frame object at 0x00AC2AC0>, 'g:\\Python\\Test\\_GetCurrentProgram.py', 15, '<module>', ['print inspect.stack()[0]\n'], 0) os.path.abspath (inspect.stack()[0][1]) => 'g:\\Python\\Test\\_GetCurrentProgram.py' 

我用__file__的方法
os.path.abspath(__file__)
但有一个小诀窍,它会在第一次运行代码时返回.py文件,接下来运行* .pyc文件
所以我留在:
inspect.getfile(inspect.currentframe())
要么
sys._getframe().f_code.co_filename

如果你只想要没有./.py的文件名,你可以试试这个

 filename = testscript.py file_name = __file__[2:-3] 

file_name将打印testscript你可以通过改变内部的索引来生成任何你想要的[]

我写了一个考虑到eclipse debugging器unittest的函数。 它将返回您启动的第一个脚本的文件夹。 您可以select指定__file__ var,但最重要的是您不必在所有调用层次结构中共享此variables。

也许你可以处理其他堆栈,我没有看到的特定情况,但对我来说没关系。

 import inspect, os def getRootDirectory(_file_=None): """ Get the directory of the root execution file Can help: http://stackoverflow.com/questions/50499/how-do-i-get-the-path-and-name-of-the-file-that-is-currently-executing For eclipse user with unittest or debugger, the function search for the correct folder in the stack You can pass __file__ (with 4 underscores) if you want the caller directory """ # If we don't have the __file__ : if _file_ is None: # We get the last : rootFile = inspect.stack()[-1][1] folder = os.path.abspath(rootFile) # If we use unittest : if ("/pysrc" in folder) & ("org.python.pydev" in folder): previous = None # We search from left to right the case.py : for el in inspect.stack(): currentFile = os.path.abspath(el[1]) if ("unittest/case.py" in currentFile) | ("org.python.pydev" in currentFile): break previous = currentFile folder = previous # We return the folder : return os.path.dirname(folder) else: # We return the folder according to specified __file__ : return os.path.dirname(os.path.realpath(_file_)) 

获取执行脚本的目录

  print os.path.dirname( inspect.getfile(inspect.currentframe())) 
 import os import wx # return the full path of this file print(os.getcwd()) icon = wx.Icon(os.getcwd() + '/img/image.png', wx.BITMAP_TYPE_PNG, 16, 16) # put the icon on the frame self.SetIcon(icon)