如何在 Python 中获取当前执行文件的路径?[重复]
- 2025-01-20 09:07:00
- admin 原创
- 83
问题描述:
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 的一部分。
首先,您需要导入inspect和os模块的部分内容。
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__'))