Python里使用相对路径的坑

过程

写了个脚本丢服务器里, 每次启动时都要去读取一个cache文件

open('table.cache', 'rb')

然后为脚本设置了一个软连接, 以后用search命名就能使用脚本了

ln -s /home/search.py /usr/bin/search

但是, 启动时却提示未找到cache文件

FileNotFoundError: [Errno 2] No such file or directory: 'table.cache'

我猜测它可能去'/usr/bin/search'里找 'table.cache'了, 于是,

touch /usr/bin/table.cache

但还是提示找不到文件, 最后猜测, 它可能在当前目录找了, 于是我随便切到一个目录里:

cd /tmp/.X11-unix/
touch table.cache
search

这下对了!
Python里写这种相对路径, 是相对于终端的当前目录的.

解决

解决办法是, 获取脚本所在目录, 构造绝对路径:

print('getcwd', os.getcwd())
print('sysargv', sys.argv)
print('realpath', os.path.realpath(sys.argv[0]))
print('realpath.split', os.path.split(os.path.realpath(sys.argv[0]))[0]) # 这是脚本所在目录
print('__file__', __file__)
print('__file__.dir', os.path.dirname(__file__)) # 这也是脚本所在目录

将上诉代码保存在 /home/speng/t.py 里, 然后:

cd /etc/named
python3 /home/speng/t.py

输出:

getcwd /etc/named
sysargv ['/home/speng/t.py']
realpath /home/speng/t.py
realpath.split /home/speng
__file__ /home/speng/t.py
__file__.dir /home/speng

推荐阅读更多精彩内容