如何获取当前正在执行的文件的路径和名称?
我有调用其他脚本文件的脚本,但是我需要获取进程中当前正在运行的文件的文件路径。
例如,假设我有三个文件。使用execfile:
script_1.py
调用script_2.py
。- 反过来," script_2.py"会调用" script_3.py"。
我如何从script_3.py内的代码中获取script_3.py的文件名和路径,而不必将该信息作为script_2.py的参数传递呢?
(执行os.getcwd()会返回原始启动脚本的文件路径,而不是当前文件的路径。)
解决方案
回答
还不清楚"进程中当前正在运行的文件的文件路径"是什么意思。
sys.argv [0]通常包含Python解释器调用的脚本的位置。
查看sys文档以获取更多详细信息。
正如@Tim和@Pat Notz指出的那样,__file__属性提供了对
the file from which the module was loaded, if it was loaded from a file
回答
我认为这只是__file__
听起来我们可能还想检出检查模块。
回答
__file__属性适用于包含主要执行代码的文件以及导入的模块。
参见https://web.archive.org/web/20090918095828/http://pyref.infogami.com/file
回答
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
回答
我们可以使用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.realpath消除符号链接:
import os os.path.realpath(__file__)
回答
import sys print sys.path[0]
这将打印当前正在执行的脚本的路径
回答
如果脚本仅包含一个文件,则标记为"最佳"的建议都是正确的。
如果要从可能作为模块导入的文件中找出可执行文件的名称(即,传递给当前程序的python解释器的根文件),则需要执行此操作(假设此文件位于文件中)名为foo.py):
进口检查
print inspect.stack()[-1] [1]
因为堆栈上的最后一件事([-1]
)是进入堆栈的第一件事(堆栈是LIFO / FILO数据结构)。
然后在文件bar.py中,如果我们"导入foo",它将打印bar.py,而不是foo.py,这将是所有这些值:
__file__
inspect.getfile(inspect.currentframe())
inspect.stack()[0] [1]
回答
import sys print sys.argv[0]