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

新手上路,请多包涵

我曾经通过简单地使用如下命令打开与当前运行的 Python 脚本位于同一目录中的文件:

 open("Some file.txt", "r")

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

从那时起我就使用了表单的命令

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])) 似乎返回脚本目录。我不确定这两者之间是否有任何区别。

编辑:

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

原文由 dln385 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 468
1 个回答

我总是使用:

 __location__ = os.path.realpath(
    os.path.join(os.getcwd(), os.path.dirname(__file__)))

join() 调用前置当前工作目录,但文档说如果某个路径是绝对路径,则它剩下的所有其他路径都将被删除。因此,当 dirname(__file__) 返回绝对路径时, getcwd() 被丢弃。

此外, realpath 调用解析符号链接(如果找到的话)。这避免了在 Linux 系统上使用 setuptools 进行部署时出现的问题(脚本链接到 /usr/bin/ 至少在 Debian 上是这样)。

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

 f = open(os.path.join(__location__, 'bundled-resource.jpg'))
# ...

我用它来将资源与 Windows 和 Linux 上的几个 Django 应用程序捆绑在一起,它就像一个魅力!

原文由 André Caron 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题