Python 的 __file__ 需用 os.path.abspath 处理

作者: , 共 671 字 , 共阅读 0

在 Python 中,有时候为了获取当前运行的脚本的同目录下的另外一个文件,会这么写:

# this is foo.py
import os
path = os.path.split(__file__)[0] + "/other.data"
print(path)

也可以用os.path.dirname代替os.path.split

# this is foo.py
import os
path = os.path.dirname(__file__) + "/other.data"
print(path)

正常执行 foo.py :

./foo.py # 需要foo.py设置了可执行权限
python ./foo.py 

都能正确输出结果:

./other.data

但如果下面这种方式运行:

python foo.py

程序输出了不符合预期的结果:

/other.data

这和 path.dirname 以及 path.split 的机制有关,它都以/为分隔符,如果传入的路径是foo.py这种不含/分隔符的路径,会导致非预期结果。

一个解决办法是添加os.path.abspath强制将foo.py转为肯定包含根目录/的绝对路径:

# this is foo.py
import os
path = os.path.dirname(os.path.abspath(__file__)) + "/other.data"
print(path)

Q. E. D.

类似文章:
主要形式是下面三种。后面两种实际指向同一个位置(如果path是一个已存在的文件夹),但处理结果会有所差异。
编程 » Python
在 Python 里,我们可以直接用 os.system 来执行系统命令(假设下面的 strip 是一个可以处理多个文件的第三者程序):
编程 » Python
Python 在搜索模块时,依次搜索sys.path里的位置,直到找到模块为止。下面命令可以查看当前的搜索路径:
编程 » Python
今天写一段程序时遇到一个问题,查了好一会才搞清楚。代码可以简化为下面这个小代码:
编程 » python, 单元测试
unittest 是 python 官方的单元测试工具。最近发现一个之前没注意到的盲区:
编程 » Python
imp.load_source在动态载入 python 模块时非常有用,但需要注意其特性。
编程 » Python, 并行计算
核心就是threading.Thread
编程 » django, requests, python
这里的 requests 是指 Python 的 requests 包。
Python 提供很多语法糖,用起来非常方便。@dataclass 就是其中之一。
Pyhon 的抽象基类( abstruct base class )库abc定义了类似于 C++的纯虚函数的功能:
周末沿着清华大学和北京大学的校园外围,顺时针骑行了一圈,一共 12 公里。其中清华大学校园大约 7.5 公里,北京大学校园大约 4.5 公里。轨迹已上传到两步路:20221204 环清华北大校园亲子骑行
今天去长峪城走了一圈,本来是打算走一个 18 公里、爬升 1200 米的大环线,最后只走了一个 14 公里爬升 700 米的往返路线,这路线还跳过了高楼、园楼等特色地点。轨迹参考20221210 长峪城往返