如何判断我是否从Textmate/emacs运行python?

0 投票
4 回答
544 浏览
提问于 2025-04-16 04:05

我用TextMate来调试Python脚本,因为我喜欢用'Command-R'这个功能直接在TextMate里运行Python。我还听说emacs也有类似的功能。

我想知道Python是从命令行运行的还是从TextMate/emacs运行的。我该怎么判断呢?

补充说明

我用TextMate来写Python代码和调试,感觉非常好用。不过,有时候我需要在命令行下运行测试。我通常在TextMate里开启调试/日志模式,而在命令行模式下则关闭。这就是我问这个问题的原因。此外,我还打算用emacs来调试Python,所以我想了解一下emacs的情况。

我在emacs的情况下得到了答案,顺便也解决了TextMate的问题。

  1. 在偏好设置里找到高级选项,然后设置Shell变量,我发现TM_ORGANIZATION_NAME这个变量已经可以用了。所以,我就用这个变量。
  2. 使用这个变量,如果os.environ['TM_ORGANIZATION_NAME']: return True

我想TextMate里的这个Shell变量在我用完后就消失了。

4 个回答

1

sys.argv 可以告诉你 Python 是怎么被调用的。我不太了解 TextMate,但在 Emacs 中,当我让它执行当前的代码时,sys.argv 的值是 ['-c']。这意味着它正在执行一个指定的命令,具体可以查阅手册。如果你直接从命令行运行 Python,没有任何参数,那么 sys.argv 的值就是 []。如果你运行一个 Python 脚本,它会包含脚本的名字和你传给它的任何参数。你可能想在 Emacs 中设置你的 Python 模式,或者在 TextMate 中找到类似的设置,把一些特别的参数,比如 -t,放到命令行中。

不过,这样做有点儿 hackish(不太正规)。也许还有更好的方法。

1

来自 官方文档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',
  ... ]
4

对于Emacs来说:如果Python作为一个子进程运行,那么环境变量 INSIDE_EMACS 会被设置。

根据文档:

Emacs会在子shell中设置环境变量 INSIDE_EMACS,这个变量的值是一个用逗号分隔的列表,其中包括Emacs的版本信息。程序可以通过检查这个变量来判断自己是否在Emacs的子shell中运行。

撰写回答