首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何可靠地打开与当前运行的脚本位于同一目录中的文件

如何可靠地打开与当前运行的脚本位于同一目录中的文件
EN

Stack Overflow用户
提问于 2010-10-31 03:05:53
回答 7查看 206.6K关注 0票数 191

我过去常常使用如下命令打开与当前运行的Python脚本位于同一目录中的文件:

代码语言:javascript
复制
open("Some file.txt", "r")

但是,我发现在Windows中双击该脚本时,它会尝试从错误的目录打开文件。

从那时起,我使用了表单的一个命令

代码语言:javascript
复制
open(os.path.join(sys.path[0], "Some file.txt"), "r")

每当我想打开一个文件的时候。这适用于我的特定用法,但我不确定sys.path[0]在其他用例中是否会失败。

所以我的问题是:打开与当前运行的Python脚本位于同一目录中的文件,最好、最可靠的方法是什么?

这是我到目前为止所能弄清楚的:

  • os.getcwd()os.path.abspath('')返回“当前工作目录”,而不是脚本目录。

  • os.path.dirname(sys.argv[0])os.path.dirname(__file__)返回用于调用脚本的路径,该路径可能是相对的,甚至是空的(如果脚本在cwd中)。此外,当脚本在IDLE或PythonWin模式下运行时,__file__也不存在。

  • sys.path[0]os.path.abspath(os.path.dirname(sys.argv[0]))似乎返回了脚本目录。我不确定这两者之间是否有什么不同。

编辑:

我刚刚意识到,我想要做的事情更好地描述为“打开与包含模块相同的目录中的文件”。换句话说,如果我导入一个我编写的位于另一个目录中的模块,并且该模块打开一个文件,我希望它在该模块的目录中查找该文件。我不认为我找到的任何东西都能做到这一点。

EN

回答 7

Stack Overflow用户

发布于 2010-10-31 03:13:31

我总是使用:

代码语言:javascript
复制
__location__ = os.path.realpath(
    os.path.join(os.getcwd(), os.path.dirname(__file__)))

join()调用预先考虑了当前的工作目录,但是文档指出,如果某个路径是绝对路径,那么它剩下的所有其他路径都会被删除。因此,当getcwd()返回绝对路径时,将删除dirname(__file__)

此外,如果找到符号链接,则realpath调用将解析符号链接。这避免了在Linux系统上使用setuptools部署时的麻烦(脚本是符号链接到/usr/bin/的--至少在Debian上是这样的)。

您可以使用以下工具打开同一文件夹中的文件:

代码语言:javascript
复制
f = open(os.path.join(__location__, 'bundled-resource.jpg'))
# ...

我使用它将资源与Windows和Linux上的几个Django应用程序捆绑在一起,它的效果非常好!

票数 242
EN

Stack Overflow用户

发布于 2011-03-29 23:38:53

引用Python文档中的内容:

在程序启动时进行初始化时,此列表的第一项路径是包含用于调用

解释器的脚本的目录。如果脚本目录不可用(例如,如果以交互方式调用解释器或从标准输入中读取脚本),则path为空字符串,它指示Python首先搜索当前目录中的模块。请注意,脚本目录被插入到作为PYTHONPATH结果插入的条目之前。

如果您从终端运行该脚本,那么sys.path[0]就是您要查找的内容。

但是,如果您有:

代码语言:javascript
复制
barpath/bar.py
    import foopath.foo

foopath/foo.py
    print sys.path[0]  # you get barpath

所以要当心!

票数 50
EN

Stack Overflow用户

发布于 2020-12-07 09:05:58

在Python3.4中,添加了pathlib module,并且以下代码将可靠地打开与当前脚本相同的目录中的文件:

代码语言:javascript
复制
from pathlib import Path

p = Path(__file__).with_name('file.txt')
with p.open('r') as f:
    print(f.read())

如果您需要字符串形式的目录值,也可以使用parent.absolute()来获取目录值,以便使用某种open-like API:

代码语言:javascript
复制
p = Path(__file__)
dir_abs = p.parent.absolute()  # Will return the executable directory absolute path
票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4060221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档