我过去常常使用如下命令打开与当前运行的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]))
似乎返回了脚本目录。我不确定这两者之间是否有什么不同。编辑:
我刚刚意识到,我想要做的事情更好地描述为“打开与包含模块相同的目录中的文件”。换句话说,如果我导入一个我编写的位于另一个目录中的模块,并且该模块打开一个文件,我希望它在该模块的目录中查找该文件。我不认为我找到的任何东西都能做到这一点。
发布于 2010-10-31 03:13:31
我总是使用:
__location__ = os.path.realpath(
os.path.join(os.getcwd(), os.path.dirname(__file__)))
join()
调用预先考虑了当前的工作目录,但是文档指出,如果某个路径是绝对路径,那么它剩下的所有其他路径都会被删除。因此,当getcwd()
返回绝对路径时,将删除dirname(__file__)
。
此外,如果找到符号链接,则realpath
调用将解析符号链接。这避免了在Linux系统上使用setuptools部署时的麻烦(脚本是符号链接到/usr/bin/
的--至少在Debian上是这样的)。
您可以使用以下工具打开同一文件夹中的文件:
f = open(os.path.join(__location__, 'bundled-resource.jpg'))
# ...
我使用它将资源与Windows和Linux上的几个Django应用程序捆绑在一起,它的效果非常好!
发布于 2011-03-29 23:38:53
引用Python文档中的内容:
在程序启动时进行初始化时,此列表的第一项路径是包含用于调用
解释器的脚本的目录。如果脚本目录不可用(例如,如果以交互方式调用解释器或从标准输入中读取脚本),则path为空字符串,它指示Python首先搜索当前目录中的模块。请注意,脚本目录被插入到作为PYTHONPATH结果插入的条目之前。
如果您从终端运行该脚本,那么sys.path[0]
就是您要查找的内容。
但是,如果您有:
barpath/bar.py
import foopath.foo
foopath/foo.py
print sys.path[0] # you get barpath
所以要当心!
发布于 2020-12-07 09:05:58
在Python3.4中,添加了pathlib
module,并且以下代码将可靠地打开与当前脚本相同的目录中的文件:
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:
p = Path(__file__)
dir_abs = p.parent.absolute() # Will return the executable directory absolute path
https://stackoverflow.com/questions/4060221
复制相似问题