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

560
我有一些脚本调用其他脚本文件,但我需要获取当前正在运行的文件的文件路径。
例如,假设我有三个文件。使用execfile
- `script_1.py` 调用 `script_2.py`。 - `script_2.py` 又调用 `script_3.py`。
在不必从 `script_2.py` 传递该信息作为参数的情况下,我如何从 `script_3.py` 的代码中获取 script_3.py 的文件名和路径?
(执行 `os.getcwd()` 返回的是原始启动脚本的文件路径,而不是当前文件的路径。)

2
os.path.realpath(file) - Girish Gupta
如何正确确定当前脚本目录? - jfs
这个回答是否回答了你的问题?如何正确确定当前脚本目录? - outis
请参阅什么是当前工作目录? - tripleee
26个回答

11

尝试这个,

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

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

无需使用inspect或其他库。

当我需要导入一个来自不同目录的脚本,并且该脚本使用与导入脚本相同文件夹中的配置文件时,这对我很有用。


如果当前工作目录(os.getcwd)与文件所在的目录不同,则这将无法产生所需的答案。 - Iron Pillow
2
怎么样?在这种情况下对我来说很好用。我得到了文件所在的目录。 - Michael Mior
@IronPillow,也许这个答案可以帮助你得到你所需要的。https://dev59.com/o2Qn5IYBdhLWcg3wg3aR#41546830 - Kwuite

8

7
import sys

print sys.path[0]

这将会打印当前执行脚本的路径。

2
sys.path[0]非常有用,但它给出的是script1的路径,而不是所需的script3的路径。 - James
至少在OS X上,使用2.7版本,我发现这并不可靠。如果直接执行相同的文件,则可以正常工作。但是从repl中无法正常工作,特别是从导入的egg中。 - uchuugaka

5

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


啊...execfile很棘手。请看我关于使用inspect模块的其他帖子。 - Pat Notz

4

您可以使用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'

3
print(__file__)
print(__import__("pathlib").Path(__file__).parent)

8
不鼓励只提供代码的答案,请添加一些解释来说明如何解决问题,或者这种方法与现有答案的不同之处。[来自审核] - Nick

3
import sys
print sys.argv[0]

10
很遗憾,这仅在使用完整路径调用脚本时才有效,因为它只返回命令行中的“第一个参数”,即对脚本的调用。 - cregox

2
这应该可以正常工作:
import os,sys
filename=os.path.basename(os.path.realpath(sys.argv[0]))
dirname=os.path.dirname(os.path.realpath(sys.argv[0]))

2
这是我使用的方法,可以让我随意将代码放在任何地方而不会出问题。 __name__ 总是被定义的,但只有当代码作为文件运行时(例如不在IDLE / iPython中),__file__ 才被定义。最初的回答:
if '__file__' in globals():
    self_name = globals()['__file__']
elif '__file__' in locals():
    self_name = locals()['__file__']
else:
    self_name = __name__

或者,这也可以写成:

最初的回答

self_name = globals().get('__file__', locals().get('__file__', __name__))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接