[转]获取当前执行主脚本的方法

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]要更可靠些。

See:http://andylin02.iteye.com/blog/933237
时间: 2024-11-06 05:37:14

[转]获取当前执行主脚本的方法的相关文章

InstallShield在MySQL和Oracle中执行SQL脚本的方法InstallShield在MySQL和Oracle中执行SQL脚本的方法

简述 InstallShield已经内建了对MySQL和Oracle的支持.但是这个功能是通过ODBC实现的,它对SQL脚本的格式要求非常严格,因此已经通过官方客户端测试的脚本在IS中执行时往往就会报错. 一般来说,数据库脚本只保证通过官方客户端测试即可,同时维护一份供IS执行的脚本费时费力.因此,考虑安装程序对两数据库的支持通过官方客户端实现. MySQL   function InstallMySQLComponent(szComponent) NUMBER nResult; STRING

jenkins执行python脚本的方法,和python版本的兼容性问题

在jenkins上打算运行一段python脚本,查到一些常用的方法,下面会介绍.还遇到了版本兼容性问题导致的怎么都执行不成功,最终试了各种版本,定位到兼容性问题,真是各种坑. 一般有三种方法:1.安装执行python的插件: Python Plugin,安装后在配置那里就可以看到以下的选项,可以在Script部分直接写python代码 2. 用Execute Windows batch command执行python脚本 3. 用Execute shell执行python脚本,注意开始要写#!p

如何使用Linux的Crontab定时执行PHP脚本的方法

我们的PHP程序有时候需要定时执行,我们可以使用ignore_user_abort函数或是在页面放置js让用户帮我们实现.但这两种方法都不太可靠,不稳定.我们可以借助Linux的Crontab工具来稳定可靠地触发PHP执行任务 下面介绍Crontab的两种方法. 一.在Crontab中使用PHP执行脚本 就像在Crontab中调用普通的shell脚本一样(具体Crontab用法),使用PHP程序来调用PHP脚本. 每一小时执行myscript.php如下: 复制代码代码如下: # crontab

Inno Setup执行SQL脚本的方法

作为和NSIS并立的.两个最流行的免费Windows应用程序安装包制作工具之一,Inno在学习难度上相对要低一些,非常适合对一些简单的桌面程序打包.但对于较复杂的安装过程,或者Web应用程序来说,我个人觉得不是Inno的强项.当然,既然Inno内嵌了Pascal语言用以扩展功能,理论上不是不可以应付复杂的安装过程,但实现起来要复杂一些. 比如对于在安装过程中连接数据库并执行SQL脚本这样的需求,使用InstallShield应该会简单地多,而Inno却不支持直接操作数据库,并且相关的资料说明少之

如何使用Linux的Crontab定时执行PHP脚本的方法[转载]

首先说说cron,它是一个linux下的定时执行工具.根用户以外的用户可以使用 crontab 工具来配置 cron 任务.所有用户定义的 crontab 都被保存在/var/spool/cron 目录中,并使用创建它们的用户身份来执行.要以某用户身份创建一个 crontab 项目,登录为该用户,然后键入 crontab -e 命令来编辑该用户的 crontab.该文件使用的格式和 /etc/crontab 相同.当对 crontab 所做的改变被保存后,该 crontab 文件就会根据该用户名

jmeter 执行python脚本的方法 。(还没试)

jmeter 可以通过Jython 执:行python代码 1.下载Jython jar包:http://www.jython.org/downloads.html 2.把下载的Jython 的jar包放到 jmeter的lib文件夹.重启jmeter 3.线程组中添加 JSR223 Sampler 4.设置JSR223 Sampler python代码 #获取jmeter 参数 param =vars.get("param") print "hello" #设置响

命令行执行Django脚本的方法

update.py import os import sys import django sys.path.append(r'C:\Users\Administrator\PycharmProjects\s6day109') os.chdir(r'C:\Users\Administrator\PycharmProjects\s6day109') os.environ.setdefault("DJANGO_SETTINGS_MODULE", "s6day109.settings

Python中执行sql脚本时GO语句出错问题

sql脚本: --创建链接服务器 (其中db2server是DB2的ip地址或服务器名)exec sp_addlinkedserver 'srv_lnk', '', 'SQLOLEDB','10.138.60.94'exec sp_addlinkedsrvlogin 'srv_lnk','false',null,'sa','123456' Go--数据导入(表B存在) --Insert into srv_lnk.sys.Estamp.EstampConfig(field1,field2)INSE

监控系统主脚本

main.sh 作为主脚本,作为整个脚本的入口,也就是说,当我们执行监控系统的时候,最开始执行的就是 main.sh,如果想去执行 shares 下的监控脚本,直接在 main.sh 去调用就可以了 [[email protected] ~]# cat mon/bin/main.sh #!/bin/bash # 是否发邮件的开关 export send=1 export addr=`/sbin/ifconfig |grep -A1 'eth0' |grep addr: |awk '{print