我如何获得当前正在执行的文件的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)