如何在 Python 中获取当前执行文件的路径?[重复]

2025-01-20 09:07:00
admin
原创
83
摘要:问题描述:Python 中是否存在一种通用的方法来找出当前正在执行的文件的路径?失败的方法path = os.path.abspath(os.path.dirname(sys.argv[0]))execfile如果您从另一个目录中的另一个 Python 脚本运行(例如在 2.x 中使用),则此方法不起作用。p...

问题描述:

Python 中是否存在一种通用的方法来找出当前正在执行的文件的路径?

失败的方法

path = os.path.abspath(os.path.dirname(sys.argv[0]))

execfile如果您从另一个目录中的另一个 Python 脚本运行(例如在 2.x 中使用),则此方法不起作用。

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

我发现这在以下情况下不起作用:

  • py2exe没有__file__属性,但有一个解决方法

  • 当代码从IDLE使用运行时execute(),在这种情况下没有__file__属性

  • 在Mac OS X v10.6 (Snow Leopard) 上,我得到NameError: global name '__file__' is not defined

测试用例

目录树

C:.
|   a.py
---subdir
        b.py

内容a.py

#! /usr/bin/env python
import os, sys

print "a.py: sys.argv[0]=", sys.argv[0]
print "a.py: __file__=", __file__
print "a.py: os.getcwd()=", os.getcwd()
print

execfile("subdir/b.py")

内容subdir/b.py

#! /usr/bin/env python
import os, sys

print "b.py: sys.argv[0]=", sys.argv[0]
print "b.py: __file__=", __file__
print "b.py: os.getcwd()=", os.getcwd()
print

输出python a.py(在 Windows 上)

a.py: __file__= a.py
a.py: os.getcwd()= C:zzz

b.py: sys.argv[0]= a.py
b.py: __file__= a.py
b.py: os.getcwd()= C:zzz

相关(但这些答案不完整)

  • 查找当前运行文件的路径

  • 当前文件的路径取决于我如何执行程序

  • 如何知道Python中运行脚本的路径?

  • 将目录更改为 Python 脚本的目录


解决方案 1:

首先,您需要从inspect和导入os

from inspect import getsourcefile
from os.path import abspath

接下来,无论你想从哪里找到源文件,只需使用

abspath(getsourcefile(lambda:0))

解决方案 2:

您无法直接确定正在执行的主脚本的位置。毕竟,有时脚本根本不是来自文件。例如,它可能来自交互式解释器或仅存储在内存中的动态生成的代码。

但是,您可以可靠地确定模块的位置,因为模块始终是从文件加载的。如果您使用以下代码创建一个模块并将其放在与主脚本相同的目录中,则主脚本可以导入该模块并使用它来定位自身。

some_path/module_locator.py:

def we_are_frozen():
    # All of the modules are built-in to the interpreter, e.g., by py2exe
    return hasattr(sys, "frozen")

def module_path():
    encoding = sys.getfilesystemencoding()
    if we_are_frozen():
        return os.path.dirname(unicode(sys.executable, encoding))
    return os.path.dirname(unicode(__file__, encoding))

some_path/main.py:

import module_locator
my_path = module_locator.module_path()

如果您在不同的目录中有多个主脚本,则可能需要多个 module_locator 副本。

当然,如果您的主脚本由其他工具加载,而该工具不允许您导入与您的脚本位于同一位置的模块,那么您就倒霉了。在这种情况下,您所需的信息根本不存在于您的程序中。最好的办法是向该工具的作者提交错误报告。

解决方案 3:

即使在可执行文件中,此解决方案也很强大:

import inspect, os.path

filename = inspect.getframeinfo(inspect.currentframe()).filename
path     = os.path.dirname(os.path.abspath(filename))

解决方案 4:

我遇到了类似的问题,我认为这可能会解决问题:

def module_path(local_function):
   ''' returns the module path without the use of __file__.  Requires a function defined
   locally in the module.
   from http://stackoverflow.com/questions/729583/getting-file-path-of-imported-module'''
   return os.path.abspath(inspect.getsourcefile(local_function))

它适用于常规脚本和IDLE。我只能说,让其他人也试试吧!

我的典型用法:

from toolbox import module_path
def main():
   pass # Do stuff

global __modpath__
__modpath__ = module_path(main)

现在我使用 modpath_而不是 file_

解决方案 5:

您只需要简单调用一下:

path = os.path.abspath(os.path.dirname(sys.argv[0]))

而不是:

path = os.path.dirname(os.path.abspath(sys.argv[0]))

abspath()`sys.argv[0]为您提供(代码所在的文件名)的绝对路径,并dirname()`返回不带文件名的目录路径。

解决方案 6:

Path您可以从模块中使用pathlib

from pathlib import Path

# ...

Path(__file__)

您可以使用调用来parent继续执行以下路径:

Path(__file__).parent

解决方案 7:

简而言之,没有保证能获得所需信息的方法,但在实践中,启发式方法几乎总是有效的。您可以查看如何找到 C 中可执行文件的位置?。它从 C 的角度讨论了这个问题,但提出的解决方案很容易转录成 Python。

解决方案 8:

请参阅我对从父文件夹导入模块问题的回答,了解相关信息,包括为什么我的回答不使用不可靠的__file__变量。这个简单的解决方案应该与不同的操作系统交叉兼容,作为模块os,并inspect作为 Python 的一部分。

首先,您需要导入inspectos模块的部分内容。

from inspect import getsourcefile
from os.path import abspath

接下来,在 Python 代码中需要的任何位置使用以下行:

abspath(getsourcefile(lambda:0))

工作原理:

从内置模块os(如下所述)中abspath导入该工具。

适用于 Mac、NT 或 Posix 的 OS 例程取决于我们所使用的系统。

然后getsourcefile(下面的描述)从内置模块导入inspect

从实时 Python 对象中获取有用的信息。

  • abspath(path)返回文件路径的绝对/完整版本

  • getsourcefile(lambda:0)以某种方式获取lambda函数对象的内部源文件,因此'<pyshell#nn>'在Python shell中返回或返回当前正在执行的Python代码的文件路径。

使用abspath的结果getsourcefile(lambda:0)应确保生成的文件路径是 Python 文件的完整文件路径。

此解释解决方案最初基于如何在 Python 中获取当前执行文件的路径?的答案中的代码。

解决方案 9:

这应该可以以跨平台的方式解决问题(只要您不使用解释器或类似的东西):

import os, sys
non_symbolic=os.path.realpath(sys.argv[0])
program_filepath=os.path.join(sys.path[0], os.path.basename(non_symbolic))

sys.path[0]是调用脚本所在的目录(它首先在此查找该脚本要使用的模块)。我们可以从末尾取出文件本身的名称sys.argv[0](我对 就是这么做的os.path.basename)。os.path.join只需以跨平台的方式将它们粘贴在一起即可。os.path.realpath只需确保如果我们获得任何名称与脚本本身不同的符号链接,我们仍然可以获得脚本的真实名称。

我没有 Mac,因此我还没有在 Mac 上测试过。如果它能工作,请告诉我,因为它看起来应该可以。我在 Linux(Xubuntu)上使用 Python 3.4 测试过。请注意,这个问题的许多解决方案在 Mac 上都不起作用(因为我听说__file__Mac 上没有这个)。

请注意,如果您的脚本是符号链接,它将为您提供它链接到的文件的路径(而不是符号链接的路径)。

解决方案 10:

只需添加以下内容:

from sys import argv
path_to_current_file = argv[0]
print(path_to_current_file)

或者:

from sys import argv
print(argv[0])

解决方案 11:

如果代码来自文件,则可以获取其全名

sys._getframe().f_code.co_filename

您还可以通过以下方式检索函数名称f_code.co_name

解决方案 12:

主要的想法是,有人会运行你的 python 代码,但你需要获取最靠近 python 文件的文件夹。

我的解决方案是:

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


os.path.dirname(os.path.abspath(__file__))
可以使用它来保存照片,输出文件......等等

解决方案 13:

import os
current_file_path=os.path.dirname(os.path.realpath('__file__'))
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用