python的几个路径 sys.argv[0],__file__,os.path.curdir

之前写过一个关于这几个路径的帖子,找不到了,最近又因为这个路径,踩了一把坑,记录一下

首先,这三个变量,都是可以用来找到当前脚本所在目录的,

sys.argv是参数列表,第一个值,python脚本或可执行文件,后边的值是传入的脚本参数

os.path.curdir 是“.”也就是当前目录,

__file__ :# 如果当前文件包含在 sys.path 里面,那么 __file__ 返回一个相对路径

              # 如果当前文件不包含在 sys.path 里面,那么 __file__ 返回一个绝对路径(此处我的文件不包含在sys.path中) f

在一些简单场景,使用哪个,都是OK的,但稍不注意,就可能踩坑了

如果我们是单个的python脚本

放在 D:\tmp\test 路径下

import os
import sys
print(os.path.abspath(sys.argv[
0])) print(os.path.abspath(os.path.curdir)) print(os.path.abspath(__file__))

 在D:\tmp\test 路径 执行 python.exe Single_path_test.py

输出分别是

D:\tmp\test\Single_path_test.py
D:\tmp\test
D:\tmp\test\Single_path_test.py

看起来没啥问题,

把执行路径换一下, 在D:\tmp路径执行 python test\Single_path_test.py

输出分别是

D:\tmp\test\Single_path_test.py
D:\tmp
D:\tmp\test\Single_path_test.py

os.path.curdir 的目录已经发生了变化,也就是os.path.curdir标识的是执行命令所在的目录,不是脚本所在的目录

再换个方式,把py脚本编译成exe

在D:\tmp\test 路径下执行Single_path_test.exe

输出的是

D:\tmp\test\Single_path_test.exe
D:\tmp\test
C:\Users\admin\AppData\Local\Temp\_MEI585722\Single_path_test.py

sys.argv[0]还是指exe,没毛病

os.path.curdir 是执行脚本/exe的目录

__file__就有意思了,变成了 

C:\Users\admin\AppData\Local\Temp\_MEI585722

  这个路径很明显是一个临时路径

这是因为,python在执行exe的时候,会把exe进行解压,解压到临时目录,然后进行执行

看起来好像无所谓的样子。

那你想一下,如果你的脚本,是在exe同级目录下去读一个资源文件(D:\tmp\test目录下),应该用哪个

用sys.argv[0]的话,肯定是可以读取到的

__file__是不是就找不到了,它找的所谓的同级目录,不是exe的同级目录,是__file__的目录也就是那个解压后的临时目录

那是是不无脑使用sys.argv[0]就可以了?

很明显不是

如果你在制作exe的时候,把pyt脚本和资源文件都进行了打包,也就是资源文件不对外展现,打包在了exe里

这时候,sys.argv[0] 获取的是exe路径,很明显不符合要求,

这个时候,就需要使用__file__动态的获取这个临时目录了

 

posted on 2023-02-12 23:16  超级大懒虫vip  阅读(256)  评论(0)    收藏  举报

导航