当前位置: 首页 > 编程日记 > 正文

python 获取脚本所在目录

pythonsys.path__file__abspathrealpath

平时写python经常会想获得脚本所在的目录,例如有个文件跟脚本文件放在一个相对的目录位置,那就可以通过脚本文件的目录找到对应的文件,即使以后脚本文件移到其他地方,脚本也基本不需要改动(相对于写死目录的好处)。下面通过一些代码进行一下对比。

这是我写的一段代码在:/root/printfabcd/py/filePath.py

Python代码  收藏代码
  1. 20 logger.debug("sys.path:"+sys.path[0])  
  2. 21 logger.debug("sys.argv:"+sys.argv[0])  
  3. 22 logger.debug("__file__:"+__file__)  
  4. 23 logger.debug("os.getcwd():"+os.getcwd())  
  5. 24 logger.debug("os.path.realpath():"+os.path.realpath(__file__))  
  6. 25 logger.debug("(os.path.abspath(__file__)):"+os.path.abspath(__file__))  
  7. 26 logger.debug("os.path.dirname(os.path.realpath()):"+os.path.dirname(os.path.realpath(__file__)))  
  8. 27 logger.debug("os.path.dirname(os.path.abspath(__file__)):"+os.path.dirname(os.path.abspath(__file__)))  

在/root/printfabcd/py 目录下执行:python filePath.py

Python代码  收藏代码
  1. 2011-11-27 13:20:20,090 DEBUG filePath 20 sys.path:/root/printfabcd/py  
  2. 2011-11-27 13:20:20,090 DEBUG filePath 21 sys.argv:filePath.py  
  3. 2011-11-27 13:20:20,090 DEBUG filePath 22 __file__:filePath.py  
  4. 2011-11-27 13:20:20,090 DEBUG filePath 23 os.getcwd():/root/printfabcd/py  
  5. 2011-11-27 13:20:20,091 DEBUG filePath 24 os.path.realpath():/root/printfabcd/py/filePath.py  
  6. 2011-11-27 13:20:20,091 DEBUG filePath 25 (os.path.abspath(__file__)):/root/printfabcd/py/filePath.py  
  7. 2011-11-27 13:20:20,091 DEBUG filePath 26 os.path.dirname(os.path.realpath()):/root/printfabcd/py  
  8. 2011-11-27 13:20:20,091 DEBUG filePath 27 os.path.dirname(os.path.abspath(__file__)):/root/printfabcd/py  

在/root 目录下执行:python printfabcd/py/filePath.py

2

Python代码  收藏代码
  1. 2011-11-27 13:20:39,227 DEBUG filePath 20 sys.path:/root/printfabcd/py  
  2. 2011-11-27 13:20:39,227 DEBUG filePath 21 sys.argv:printfabcd/py/filePath.py  
  3. 2011-11-27 13:20:39,227 DEBUG filePath 22 __file__:printfabcd/py/filePath.py  
  4. 2011-11-27 13:20:39,228 DEBUG filePath 23 os.getcwd():/root  
  5. 2011-11-27 13:20:39,228 DEBUG filePath 24 os.path.realpath():/root/printfabcd/py/filePath.py  
  6. 2011-11-27 13:20:39,228 DEBUG filePath 25 (os.path.abspath(__file__)):/root/printfabcd/py/filePath.py  
  7. 2011-11-27 13:20:39,228 DEBUG filePath 26 os.path.dirname(os.path.realpath()):/root/printfabcd/py  
  8. 2011-11-27 13:20:39,228 DEBUG filePath 27 os.path.dirname(os.path.abspath(__file__)):/root/printfabcd/py  

从上面两个输出可以看出来,如果想获得脚本所在目录最简单就是通过sys.path[0],os.getcwd()获得的是执行脚本的目录。

下面在做一下测试 我在/root/printfabcd/py/下创建一个软连接tfilePath.py 指向filePath.py,执行tfilePath.py

Python代码  收藏代码
  1. 2011-11-27 13:20:57,466 DEBUG tfilePath 20 sys.path:/root/printfabcd/py  
  2. 2011-11-27 13:20:57,466 DEBUG tfilePath 21 sys.argv:printfabcd/py/tfilePath.py  
  3. 2011-11-27 13:20:57,466 DEBUG tfilePath 22 __file__:printfabcd/py/tfilePath.py  
  4. 2011-11-27 13:20:57,467 DEBUG tfilePath 23 os.getcwd():/root  
  5. 2011-11-27 13:20:57,467 DEBUG tfilePath 24 os.path.realpath():/root/printfabcd/py/filePath.py  
  6. 2011-11-27 13:20:57,467 DEBUG tfilePath 25 (os.path.abspath(__file__)):/root/printfabcd/py/tfilePath.py  
  7. 2011-11-27 13:20:57,467 DEBUG tfilePath 26 os.path.dirname(os.path.realpath()):/root/printfabcd/py  
  8. 2011-11-27 13:20:57,468 DEBUG tfilePath 27 os.path.dirname(os.path.abspath(__file__)):/root/printfabcd/py  

仔细看os.path.realpath()和os.path.abspath()可以看出他们的区别,即使你创建了软连接,realpath还是可以拿到真正对应的文件。我是一个python的初学者懂得不多,如果发现什么问题,请多多指正。

下面是__file__与sys.argv[0]的一个对比

转载自:http://andylin02.iteye.com/blog/933237

python __file__ 与argv[0]

在python下,获取当前执行主脚本的方法有两个:sys.argv[0]和__file__。

sys.argv[0]

获取主执行文件路径的最佳方法是用sys.argv[0],它可能是一个相对路径,所以再取一下abspath是保险的做法,像这样:

import os,sys
dirname, filename = os.path.split(os.path.abspath(sys.argv[0]))
print "running from", dirname
print "file is", filename

__file__

__file__ 是用来获得模块所在的路径的,这可能得到的是一个相对路径,比如在脚本test.py中写入:

#!/usr/bin/env python
print __file__

  • 按相对路径./test.py来执行,则打印得到的是相对路径,
  • 按绝对路径执行则得到的是绝对路径。
  • 而按用户目录来执行(~/practice/test.py),则得到的也是绝对路径(~被展开)
  • 所以为了得到绝对路径,我们需要 os.path.realpath(__file__)。

而在Python控制台下,直接使用print __file__是会导致  name ‘__file__’ is not defined错误的,因为这时没有在任何一个脚本下执行,自然没有 __file__的定义了。

__file__和argv[0]差异

在主执行文件中时,两者没什么差异,不过要是在不同的文件下,就不同了,下面示例:

C:\junk\so>type \junk\so\scriptpath\script1.py
import sys, os
print "script: sys.argv[0] is", repr(sys.argv[0])
print "script: __file__ is", repr(__file__)
print "script: cwd is", repr(os.getcwd())
import whereutils
whereutils.show_where()C:\junk\so>type \python26\lib\site-packages\whereutils.py
import sys, os
def show_where():print "show_where: sys.argv[0] is", repr(sys.argv[0])print "show_where: __file__ is", repr(__file__)print "show_where: cwd is", repr(os.getcwd())C:\junk\so>\python26\python scriptpath\script1.py
script: sys.argv[0] is 'scriptpath\\script1.py'
script: __file__ is 'scriptpath\\script1.py'
script: cwd is 'C:\\junk\\so'
show_where: sys.argv[0] is 'scriptpath\\script1.py'
show_where: __file__ is 'C:\\python26\\lib\\site-packages\\whereutils.pyc'
show_where: cwd is 'C:\\junk\\so'

所以一般来说,argv[0]要更可靠些。

转载于:https://www.cnblogs.com/sthinker/p/7456048.html

相关文章:

《深入理解计算机系统》第十章——系统级I/0

目录 10.1Unix I/O 10.2文件 10.3打开和关闭文件 10.4读和写文件 10.5用RIO包建壮地读写 10.6读取文件元数据 10.7读取目录内容 10.8共享文件 10.9 I/O重定向 10.10 标准I/O 10.1Unix I/O 在Linux中,一切皆为文件。 文件I/O函数-------打开文件、读文件…

终于完成了“微软”化

整整忙活了一个下午,基本上我的笔记本完成了可怕的“微软”化进程!是的,当我完成FOXMAIL中邮件向OUTLOOK2007的迁移后,在办公层面,已经完成“微软”化了。其实真的不想这样,但是想MS在独霸桌面后&#xff0…

C#创建Windows服务

利用VS.NET创建C# Windows服务在很多应用中需要做windows服务来操作数据库等操作,比如 (1)一些非常慢的数据库操作,不想一次性去做,想慢慢的通过服务定时去做,比如定时为数据库备份等 (2&#x…

《深入理解计算机系统》第七章——链接知识点总结

目录 7.1编译器驱动程序 7.2静态链接 7.3目标文件 7.4可重定位目标文件 7.5符号和符号表 7.6符号解析 • 静态库(.a archive files) 7.1编译器驱动程序 7.2静态链接 7.3目标文件 7.4可重定位目标文件 使用readelf -S查看hello.o 一个典型的ELF可重定位目标文件包含以下…

排序算法之直接插入排序

1、基本思想: 已知待排序列r[1...n],先将序列中的第一个记录看成是一个有序的子序列,然后从第二个记录起逐个进行插入,直至整个序列变成关键字非递减有序序列为止。 具体操作如下: (1)查找出r[i]在有序序列…

【代码片段】如何使用CSS来快速定义多彩光标

对于web开发中,我们经常都看得到需要输入内容的组件和元素,比如,textarea,或者可编辑的DIV(contenteditable) ,如果你也曾思考过使用相关方式修改一下光标颜色的,那么这篇技术小分享,你绝对不应…

如何划分155MSDH带宽

我们单位拟计划租用运营商155MSDH电路,由于我们单位应用业务较多,为了避免各业务之间相互影响,更好地分享带宽,根据各业务数据量的大小,分别赋予一定的带宽,使各业务在自己的带宽内传输,但不知选…

慕课袁春风老师《计算机系统基础》一二三部分练习题

2.2 1、下列几种存储器中,( A )是易失性存储器。 A. cache B. EPROM C. Flash Memory D. CD-ROM 2、下面有关半导体存储器组织的叙述中,错误的是( D )。 A. 存储器的核心部分是存储阵列,…

47种常见的浏览器兼容性问题大汇总

浏览器兼容性问题大汇总 JavaScript 31. HTML对象获取问题 32. const问题 33. event.x与event.y问题 34. window.location.href问题 35. frame问题 36. 模态和非模态窗口问题 37. firefox与IE的父元素(parentElement)的区别 38. document.formName.item(”itemName”) 问题 39.…

封装了一下我佛山人4.0 (支持vs2005)asp.net 页面验证

第一次写控件,拿“我佛山人4.0”开个刀,实际上也不算是什么控件,只是封装了一下,方便在asp.net中使用。 建议先看“我佛山人 4。0”文档。 声明:控件中参考了不少网上的源码,大家不要觉得眼熟BS人啊。注&am…

九章算法班L8 Array Number

转载于:https://www.cnblogs.com/sissie-coding/p/10295478.html

linux密码时效更改方法

密码时效 按目前的形势,已有更强大的硬件大大地缩短了利用自动运行的程序来猜测密码的时间。因此在UNIX系统中防止密码被***的别一方法就是要经常地改变密码。很多时候,用户却不改变密码。因此一种机制用来强制规律性的更改密码是合乎要求的。这种技术称…

YOLOv10训练自己的数据集

至此,整个YOLOv10的训练预测阶段完成,与YOLOv8差不多。欢迎各位批评指正。

安卓相对布局常用语句

不BB写在自己博客园看的舒服 RelativeLayout布局 android:layout_marginTop"25dip" //顶部距离 android:gravity"left" //空间布局位置 android:layout_marginLeft"15dip //距离左边距 // 相对于给定ID控件 android:layout_above 将该控件的底部置于…

Tomcat V6 Examples移植到Apusic V5.1

目标:将Tomcat V6的的例子Examples移植到Apusic V5.1上术语:Tomcat:只提供了WEB容器的开源服务器;Apusic:提供了完整的J2EE支持的商用服务器;%TOMCAT_HOME%:Tomcat安装目录%APUSIC_HOME%&#x…

Android 活动与活动间数据传递--登录注册页面

AndroidManifest.xml: <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"package"com.example.myapplica…

使用SVG中的Symbol元素制作Icon

前言 随着大屏幕分辨率的普及以及各种移动设备层出不穷的移动互联网时代的到来&#xff0c;我们在网站设计时更应该关心内容在各种设备上的阅读性和显示效果。我们都希望能在任何时间&#xff0c;任何设备上都能清楚的&#xff0c;高效的传递信息给用户。 而随着各种高清视网膜…

【JOURNAL】恭喜发财

刚写完上一条blog不久&#xff0c;南京城里开始响彻了鞭炮声&#xff0c;人见人爱、极具亲和力的财神来了。上海的一个朋友发短信来说那个国际化大都市也被对财神的膜拜感染得热闹喧天。这是好的。昨天给老婆表亲家的孩子压岁钱&#xff0c;对方说免了吧&#xff0c;我坚持让他…

[树形dp] Jzoj P5233 概率博弈

Description 小A和小B在玩游戏。这个游戏是这样的&#xff1a;有一棵n个点的以1为根的有根树&#xff0c;叶子有权值。假设有m个叶子&#xff0c;那么树上每个叶子的权值序列就是一个1->m 的排列。一开始在1号点有一颗棋子。两人轮流将这颗棋子移向其当前位置的一个儿子。假…

ASP.NET获取IP的6种方法

服务端&#xff1a; //方法一HttpContext.Current.Request.UserHostAddress; //方法二HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];//方法三stringstrHostName System.Net.Dns.GetHostName();stringclientIPAddress System.Net.Dns.GetHostAddresse…

软件工程实践第一次作业

准备篇 一、回想一下你初入大学时对计算机专业的畅想 当初你是如何做出选择计算机专业的决定的&#xff1f; 在读到博文B时&#xff0c;博客B[1]的作者说道&#xff1a;“ 那时&#xff0c;对其他学校认知的匮乏让自己无助起来&#xff0c;最后的抉择&#xff0c;是希望选择一个…

VC 6.0不老

最近做的几个项目&#xff0c;客户都是要求使用Vc 6开发&#xff0c;我用的是VC 6.0 Sp6。VC 6 装上插件之后发现使用方便多了&#xff0c;下面是转载[url]http://hi.baidu.com/linuxtoys/blog/item/5f4251a9f12a53fd1e17a272.html[/url] 的一篇关于VC6的小插件的文章&#xff…

[03] 处理注解:反射

1、AnnotatedElement接口如果没有用来读取注解的方法和工作&#xff0c;那么注解也就不会比注释更有用处了。使用注解的过程中&#xff0c;很重要的一部分就是创建于使用注解处理器。Java SE5扩展了反射机制的API&#xff0c;以帮助程序员快速的构造自定义注解处理器。Java用An…

P2261 [CQOI2007]余数求和

我是题面 题意还是很清晰&#xff0c;很容易理解 1e9范围明显不能暴力&#xff0c;除非你能把常数优化到\(\frac1 {10}\)&#xff0c;但我实在想象不到用了这么多取模怎么把常数优化下去 我们可以把\(k\%i\)变成\(k-k/i*i\)(整除) 那么总的和也就从\(\sum_{i1}^{n}k\%i\)变成了…

Windows Server 2008正式版[微软官方下载地址+官方语言包]

Windows Server 2008(包含 Standard Enterprise Datacenter)32http://download.microsoft.com/download/d/d/b/ddb17dc1-a879-44dd-bd11-c0991d292ad7/6001.18000.080118-1840_x86fre_Server_en-us-KRMSFRE_EN_DVD.iso64http://download.microsoft.com/download/d/d/b/ddb17dc1…

线性代数-矩阵-【5】矩阵化简 C和C++实现

点击这里可以跳转至 【1】矩阵汇总&#xff1a;http://www.cnblogs.com/HongYi-Liang/p/7287369.html 【2】矩阵生成&#xff1a;http://www.cnblogs.com/HongYi-Liang/p/7275278.html 【3】矩阵加减&#xff1a;http://www.cnblogs.com/HongYi-Liang/p/7287403.html 【4】矩阵…

哈佛管理论丛:谁背上了令人讨厌的猴子

先说说我的读后感想&#xff1a; 在团队管理中&#xff0c;应该尽量明晰的界定每一位团队成员在当前的任务中充当的角色和应该负责的职责。 实际的执行方法就是&#xff1a;约定好给猴子喂食的时间&#xff0c;并且确定在喂食时间到来时&#xff0c;猴子应该长成什么样子。 所以…

json_encode 中文不乱码

echo json_encode("中文", JSON_UNESCAPED_UNICODE);//"中文" 转载于:https://www.cnblogs.com/zxqblogrecord/p/10300244.html

Android-room的学习

目录 关于ROOM 1.Room有3个主要的组件 2.Room 不同组件之间的关系如图所示 3.导入ROOM&#xff08;使用 Room 需要添加依赖&#xff09; 4.&#xff08;实现数据库操作的步骤&#xff09;以下代码段包含具有一个实体和一个 DAO 的示例数据库配置 实例demo 1.Student.java …