【问题标题】:Why is my .pythonrc file being run in non-interactive programs?为什么我的 .pythonrc 文件在非交互式程序中运行?
【发布时间】:2023-03-09 04:43:01
【问题描述】:

背景:大约一年前我开始使用 OSX,我安装了一种奇怪的 Python。也就是说,我正在使用系统 python,并使用 sudo 安装软件包,这似乎可以使事情正常进行。现在,我从全新的 OSX 安装开始,并尝试以正确的方式进行安装。我已经从 brew 安装了 python 和 python3,并尽可能尝试使用 python3。

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

我对 rc 文件的理解肯定有一些差距——我认为目的是专门用于交互式使用的。尽管如此,当我使用系统 python 时,并没有使用 rc 文件 - 所以我的系统 python(/usr/bin/python 上的 2.7.10)与 brew python(/usr/local/bin 上的 2.7.12)有些不同/python; 3.5.2 在 /usr/local/bin/python3)。如果我从 rc 文件中删除除打印语句之外的所有内容,则行为是相同的。

编辑:我意识到 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()

【问题讨论】:

    标签: python macos ipython homebrew


    【解决方案1】:

    你可以问回溯模块:

    $ cat .pythonrc
    import traceback; traceback.print_stack()
    
    $ cat test.py
    import ipdb
    

    然后通过运行

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

    您应该得到一个回溯,它可以准确地告诉您启动脚本是从哪里运行的。这很可能是由于通话造成的

    start_ipython()
    

    在 ipdb 导入中的某处。

    【讨论】:

    • 我看到ipapp.initialize([]),没有start_ipythoninitialize 调用发生在 except 内,发生在 get_ipython 失败之后。这似乎内容丰富,但我不太确定这意味着什么......
    • 那只是表示 IPython 还没有被加载。你能发布完整的堆栈跟踪吗?
    • 上面添加了堆栈跟踪。
    • 查看回溯,在调用 ipapp.initialize([]) 之前,ipdb 应该具有类似于 `ipapp.exec_PYTHONSTARTUP = False` 的内容。我建议向 ipdb 维护者提交一个错误。
    猜你喜欢
    • 2016-05-09
    • 1970-01-01
    • 2021-07-25
    • 2012-08-11
    • 2015-06-04
    • 1970-01-01
    • 2018-10-30
    • 2013-04-16
    相关资源
    最近更新 更多