之前写过一个关于这几个路径的帖子,找不到了,最近又因为这个路径,踩了一把坑,记录一下
首先,这三个变量,都是可以用来找到当前脚本所在目录的,
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__动态的获取这个临时目录了
标签:__,tmp,exe,python,argv,sys,test,path From: https://www.cnblogs.com/superlazybug/p/17114071.html