我曾经通过简单地使用如下命令打开与当前运行的 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 许可协议
我总是使用:
join()
调用前置当前工作目录,但文档说如果某个路径是绝对路径,则它剩下的所有其他路径都将被删除。因此,当dirname(__file__)
返回绝对路径时,getcwd()
被丢弃。此外,
realpath
调用解析符号链接(如果找到的话)。这避免了在 Linux 系统上使用 setuptools 进行部署时出现的问题(脚本链接到/usr/bin/
至少在 Debian 上是这样)。您可以使用以下方法打开同一文件夹中的文件:
我用它来将资源与 Windows 和 Linux 上的几个 Django 应用程序捆绑在一起,它就像一个魅力!