为什么我的.pythonrc文件在非交互式程序中运行?

时间:2016-08-05 04:20:55

标签: python macos ipython homebrew

背景信息:大约一年前我开始使用OSX,我有一种棘手的python安装。也就是说,我正在使用系统python,并且在使用sudo的时候安装了包。现在,我从一个全新的OSX安装开始,并尝试以正确的方式进行。我已经从brew安装了python和python3,并尽可能尝试使用python3。

问题:我有一个.pythonrc文件,它只导入了一些常用的软件包 - 主要是标准的lib,一些流行的非标准软件包,还有一些我自己的软件包。过去,只有在我启动交互式shell时才会运行此文件。现在,当使用brew python时,每当我运行任何python程序时它都会运行。

我对rc文件的理解肯定存在一些差距 - 我认为目的是专门用于交互式使用。不过,当我使用system python时,rc文件并没有被使用 - 所以我的系统python(2.7.10 at / usr / bin / python)与brew python(2.7.12 at / usr / local)有所不同/ bin / python; 3.5.2 at / usr / local / bin / python3)。如果我从rc文件中删除除print参数之外的所有内容,行为是相同的。

编辑:我意识到rc文件正在运行,因为我正在导入ipdb。我认为这是有道理的,但我仍然不明白为什么在某些python环境/版本中会发生这种情况,而不是其他环境/版本。

编辑:https://github.com/gotcha/ipdb/blob/master/ipdb/main.py#L44此行失败,不确定这是否意味着什么。

.pythonrc中的完整堆栈跟踪:

  File "hello.py", line 1, in <module>
    from ipdb import set_trace
  File "/usr/local/lib/python2.7/site-packages/ipdb/__init__.py", line 7, in <module>
    from ipdb.__main__ import set_trace, post_mortem, pm, run             # noqa
  File "/usr/local/lib/python2.7/site-packages/ipdb/__main__.py", line 51, in <module>
    ipapp.initialize([])
  File "<decorator-gen-109>", line 2, in initialize
  File "/usr/local/lib/python2.7/site-packages/traitlets/config/application.py", line 74, in catch_config_error
    return method(app, *args, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/IPython/terminal/ipapp.py", line 315, in initialize
    self.init_code()
  File "/usr/local/lib/python2.7/site-packages/IPython/core/shellapp.py", line 263, in init_code
    self._run_startup_files()
  File "/usr/local/lib/python2.7/site-packages/IPython/core/shellapp.py", line 342, in _run_startup_files
    self._exec_file(python_startup)
  File "/usr/local/lib/python2.7/site-packages/IPython/core/shellapp.py", line 328, in _exec_file
    raise_exceptions=True)
  File "/usr/local/lib/python2.7/site-packages/IPython/core/interactiveshell.py", line 2469, in safe_execfile
    self.compile if kw['shell_futures'] else None)
  File "/usr/local/lib/python2.7/site-packages/IPython/utils/py3compat.py", line 288, in execfile
    builtin_mod.execfile(filename, *where)
  File "~/.pythonrc", line 57, in <module>
    import traceback; traceback.print_stack()

1 个答案:

答案 0 :(得分:1)

您可以询问追溯模块:

$ cat .pythonrc
import traceback; traceback.print_stack()

$ cat test.py
import ipdb

然后运行

$ PYTHONSTARTUP="$HOME/.pythonrc" python test.py 

您应该获得一个回溯,告诉您确切地从哪里运行启动脚本。最有可能的是,这是由于电话

start_ipython()

在ipdb导入的某个地方。