首页 > 编程语言 >python的几个路径 sys.argv[0],__file__,os.path.curdir

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

时间:2023-02-12 23:23:44浏览次数:45  
标签:__ tmp exe python argv sys test path

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

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

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

相关文章

  • E. Edge Reverse
    E.EdgeReverse思路二分建图,然后缩点。如果只有1个点入度为0,那就是满足条件的代码#include<bits/stdc++.h>usingnamespacestd;usingpii=pair<int,int>;using......
  • idea部署二手交易平台
    1.安装javajava8:https://www.aliyundrive.com/s/FmeWnLMFRD4一路默认安装即可。配置环境变量在设置里面搜索高级系统,点击查看高级系统设置。新建JAVA_HOME变量,填入j......
  • 原子操作
    概述原子(atomic)本意是“不能被进一步分割的最小粒子”,而原子操作(atomicoperation)意为“不可被中断的一个或一系列操作”,可以保证指令以原子的方式运行,即执行过程不被打断......
  • C/C++飞机订票系统[2023-02-12]
    C/C++飞机订票系统[2023-02-12]飞机订票系统1、需求分析航班信息用文件保存,因而要提供文件的输入输出操作:航班信息浏览功能需要提供显示操作;要查询航线需要提供查找功......
  • Static静态
    Static静态静态,对象层级变为了类层级,不用创建对象,直接通过类名.调用1.静态属性通常成员变量属于对象层级,每创建一个对象就会创建与之对应的成员属性,开辟内存空间。但......
  • CSS Animation
    为什么要引入CSSAnimation视觉动物怎么能止步于看静态的?人性是第一生产力关键是解放了Javascript如何完成一个简单的动画使用@keyframes结合animation来完成举......
  • 基于汉明软译码和球型译码的通信链路误码率matlab仿真
    1.算法描述       MIMO检测是简单假设检验中的经典问题[1]。最大似然(ML)检测器涉及穷举搜索,并且在最小误差联合误差的意义上是最佳检测器,用于同时检测所有符号。......
  • 第二章 数据结构一
    链表用数组模拟链表(链式向前星)分类:单链表,最主要用单链表写邻接表,用邻接表存储图或者树双链表,优化某些问题对于单链表,开2个数组val[N],nxt[N],其中val用来存每个链......
  • RobotFramework基本语法----IF语句
    if语句通过runKeywords以达到语句块功能runkeywordif   '${type1}'=='1'and'${type2}'=='2'  runKeywords  shouldbetrue  '${status1}'=='enab......
  • 网站在线客服系统实时语音视频聊天实战开发,利用peerjs vue.js实现webRTC网页音视频客
    webRTC机制和peerjs库的介绍在其他博客中已经有了很多介绍,这里我直接搬运过来一、webrtc回顾WebRTC(WebReal-TimeCommunication)即:网页即时通信。简单点讲,它可以实现浏......