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

时间:2020-03-05 18:49:36  来源:igfitidea点击:

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

例如,假设我有三个文件。使用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]