如何判断我是否从Textmate/emacs运行python?
我用TextMate来调试Python脚本,因为我喜欢用'Command-R'这个功能直接在TextMate里运行Python。我还听说emacs也有类似的功能。
我想知道Python是从命令行运行的还是从TextMate/emacs运行的。我该怎么判断呢?
补充说明
我用TextMate来写Python代码和调试,感觉非常好用。不过,有时候我需要在命令行下运行测试。我通常在TextMate里开启调试/日志模式,而在命令行模式下则关闭。这就是我问这个问题的原因。此外,我还打算用emacs来调试Python,所以我想了解一下emacs的情况。
我在emacs的情况下得到了答案,顺便也解决了TextMate的问题。
- 在偏好设置里找到高级选项,然后设置Shell变量,我发现TM_ORGANIZATION_NAME这个变量已经可以用了。所以,我就用这个变量。
- 使用这个变量,如果os.environ['TM_ORGANIZATION_NAME']: return True
我想TextMate里的这个Shell变量在我用完后就消失了。
4 个回答
sys.argv
可以告诉你 Python 是怎么被调用的。我不太了解 TextMate,但在 Emacs 中,当我让它执行当前的代码时,sys.argv
的值是 ['-c']
。这意味着它正在执行一个指定的命令,具体可以查阅手册。如果你直接从命令行运行 Python,没有任何参数,那么 sys.argv
的值就是 []
。如果你运行一个 Python 脚本,它会包含脚本的名字和你传给它的任何参数。你可能想在 Emacs 中设置你的 Python 模式,或者在 TextMate 中找到类似的设置,把一些特别的参数,比如 -t
,放到命令行中。
不过,这样做有点儿 hackish(不太正规)。也许还有更好的方法。
来自 官方文档 对 sys.path
的说明:
在程序启动时,这个列表的第一个项目,也就是
path[0]
,是包含用来启动 Python 解释器的脚本的目录。如果脚本所在的目录不可用(比如说当解释器以交互方式启动时,或者脚本是从标准输入读取的),那么path[0]
就是一个空字符串,这样 Python 会优先在当前目录中查找模块。注意,脚本所在的目录会被放在 PYTHONPATH 变量所指定的路径之前。
所以
if sys.path[0]:
# python was run interactively
else:
# python is running a script.
或者,比如说,从 IPython 提示符(在 Emacs 内部):
In [65]: sys.path
Out[65]:
['', <-------------------- first entry is empty string
'/usr/bin',
'/usr/local/lib/python2.6/dist-packages/scikits.statsmodels-0.2.0-py2.6.egg',
'/usr/local/lib/python2.6/dist-packages/pyinterval-1.0b21-py2.6-linux-i686.egg',
... ]
对于Emacs来说:如果Python作为一个子进程运行,那么环境变量 INSIDE_EMACS
会被设置。
根据文档:
Emacs会在子shell中设置环境变量
INSIDE_EMACS
,这个变量的值是一个用逗号分隔的列表,其中包括Emacs的版本信息。程序可以通过检查这个变量来判断自己是否在Emacs的子shell中运行。