bog*_*dan 229 python pythonpath dirname
我想看看在python中确定当前脚本目录的最佳方法是什么?
我发现,由于调用python代码的方法很多,很难找到一个好的解决方案.
这是一些问题:
__file__如果脚本执行时未定义exec,execfile__module__ 仅在模块中定义用例:
./myfile.pypython myfile.py./somedir/myfile.pypython somedir/myfile.pyexecfile('myfile.py') (来自另一个脚本,可以位于另一个目录中,并且可以有另一个当前目录.我知道没有完美的解决方案,但我正在寻找解决大多数情况的最佳方法.
最常用的方法是os.path.dirname(os.path.abspath(__file__)),如果你从另一个脚本执行脚本,这实际上不起作用exec().
任何使用当前目录的解决方案都将失败,根据调用脚本的方式或者可以在运行的脚本中更改它,可能会有所不同.
bob*_*nce 205
os.path.dirname(os.path.abspath(__file__))
Run Code Online (Sandbox Code Playgroud)
确实是你最好的.
使用exec/ 执行脚本是不常见的execfile; 通常您应该使用模块基础结构来加载脚本.如果您必须使用这些方法,我建议您在传递给脚本时进行设置__file__,globals以便它可以读取该文件名.
没有其他方法可以在执行代码中获取文件名:正如您所注意到的,CWD可能处于完全不同的位置.
Sve*_*ach 124
如果您真的想要涵盖通过调用脚本的情况execfile(...),您可以使用该inspect模块来推断文件名(包括路径).据我所知,这适用于您列出的所有情况:
filename = inspect.getframeinfo(inspect.currentframe()).filename
path = os.path.dirname(os.path.abspath(filename))
Run Code Online (Sandbox Code Playgroud)
jfs*_*jfs 40
#!/usr/bin/env python
import inspect
import os
import sys
def get_script_dir(follow_symlinks=True):
if getattr(sys, 'frozen', False): # py2exe, PyInstaller, cx_Freeze
path = os.path.abspath(sys.executable)
else:
path = inspect.getabsfile(get_script_dir)
if follow_symlinks:
path = os.path.realpath(path)
return os.path.dirname(path)
print(get_script_dir())
Run Code Online (Sandbox Code Playgroud)
它适用于CPython,Jython,Pypy.如果使用execfile()(sys.argv[0]并且__file__基于此的解决方案将在此处失败)执行脚本,它可以工作.如果脚本在可执行的zip文件(/ egg)中,它就可以工作.如果脚本是PYTHONPATH=/path/to/library.zip python -mscript_to_run从zip文件"导入"(),它可以工作; 在这种情况下,它返回归档路径.如果脚本编译为独立的可执行文件(sys.frozen),它就可以工作.它适用于符号链接(realpath消除符号链接).它适用于交互式口译员; 在这种情况下,它返回当前的工作目录.
Eug*_*ash 22
在Python 3.4+中,您可以使用更简单的pathlib模块:
from inspect import currentframe, getframeinfo
from pathlib import Path
filename = getframeinfo(currentframe()).filename
parent = Path(filename).resolve().parent
Run Code Online (Sandbox Code Playgroud)
https://github.com/heetbeet/locate
$ pip install locate
$ python
>>> from locate import this_dir
>>> print(this_dir())
C:/Users/simon
Run Code Online (Sandbox Code Playgroud)
.py脚本以及交互式使用:我经常使用脚本的目录(用于访问与它们一起存储的文件),但我也经常在交互式 shell 中运行这些脚本以进行调试。我定义this_dir为:
.py文件时,文件的基目录。这始终是正确的道路。.ipyn笔记本时,当前工作目录。这始终是正确的路径,因为 Jupyter 将工作目录设置为.ipynb基本目录。from pathlib import Path
this_dir = Path(globals().get("__file__", "./_")).absolute().parent
Run Code Online (Sandbox Code Playgroud)
import os
this_dir = os.path.dirname(os.path.abspath(globals().get("__file__", "./_")))
Run Code Online (Sandbox Code Playgroud)
globals()以字典形式返回所有全局变量。.get("__file__", "./_")"__file__"如果键存在于 中,则返回该键的值globals(),否则返回提供的默认值"./_"。__file__(或"./_") 扩展为绝对文件路径,然后返回文件路径的基目录。如果您确定__file__周围代码可用,则可以简化为:
this_dir = Path(__file__).absolute().parentthis_dir = os.path.dirname(os.path.abspath(__file__))会
import os
cwd = os.getcwd()
Run Code Online (Sandbox Code Playgroud)
做你想做的事?我不确定“当前脚本目录”到底是什么意思。您给出的用例的预期输出是什么?
该os.path...方法是Python 2中的“完成的事情”。
在Python 3中,您可以找到脚本目录,如下所示:
from pathlib import Path
cwd = Path(__file__).parents[0]
Run Code Online (Sandbox Code Playgroud)
只需使用os.path.dirname(os.path.abspath(__file__))并仔细检查是否真的需要使用的情况exec.如果您无法将脚本用作模块,则可能是设计有问题的迹象.
请记住Python#8的Zen,如果您认为对于必须工作的用例有一个很好的论据exec,请告诉我们有关问题背景的更多细节.
| 归档时间: |
|
| 查看次数: |
103268 次 |
| 最近记录: |