gpt4 book ai didi

python - 将 'from __future__' 与 ipython 和 PYTHONSTARTUP 一起使用

转载 作者:行者123 更新时间:2023-11-28 20:47:14 26 4
gpt4 key购买 nike

我想拥有

from __future__ import (absolute_import, division, print_function, unicode_literals)

在每个交互式 session 中加载,使用 PYTHONSTARTUP 文件。这适用于基本的 python(2.7.5,与 Anaconda 一起安装),但不适用于 ipython(1.0.0,Anaconda)。其他 import 语句适用于 ipython,但 __future__ 语句将被忽略(尽管如果我在命令行中输入它们它们会起作用)。这是一个 ipython 错误,还是我遗漏了什么?

最佳答案

这里有两个问题。


第一个比 __future__ 语句更通用:至少在我的测试中,ipython 1.0.0 和更早版本根本不处理 PYTHONSTARTUP 环境变量.您可以很容易地看到这一点:

$ echo -e 'print "PYTHONSTARTUP!"\n' > pythonstartup.py
$ PYTHONSTARTUP=./pythonstartup.py ipython

没有额外的打印出来。


#2706建议它应该这样做,#3569打了补丁,1.1.0 似乎是第一个有变化的版本。

因此,解决方法是升级到 1.1.0。或者,如果您坚持使用旧版本,请执行 #2706 中的建议,并将其添加到您的第一个 $IPYTHONDIR/profile_default/startup/*py 文件中:

import os

if os.environ['PYTHONSTARTUP']:
execfile(os.environ['PYTHONSTARTUP'])

但是,这仍然不能解决问题。

$PYTHONSTARTUP 的运行方式(由您显式执行或由 iPython 隐式执行)等同于 exec。它确实明确地向 exec 提供了适当的 globals,这确保您最终得到可用的 print_function 元组……但这不会影响解析器。 (比较在交互式 shell 中键入 exec('from __future__ import print_function)`。)

同样适用于上述启动文件、向后兼容的 ipython.rc 文件(如果您启用了该文件)以及任何其他应该在您的文件中执行的文件交互式环境——它们实际上只是在您的 globals 中被 exec 执行,这不是一回事。

即使在您的 ipython_config.py 或其他应用程序配置脚本中作为 exec_files 机制的一部分执行的文件也以这种方式处理。

但是,作为exec_lines 机制的一部分执行的行不是。所以,这就是解决方案。


编辑或创建 ~/.ipython/profile_default/ipython_config.py。 (如果您使用不同的配置文件、ipythondir、应用程序名称等,您大概知道这些,并且知道如何调整。)

如果它不存在,添加这一行:

c = get_config()

然后添加:

c.InteractiveShellApp.exec_lines = ['from __future__ import print_function']

参见 Configuring the ipython command line application了解更多详情。


如果你真的想,你可能会做这样的事情:

import os
try:
# Make sure to pop it so it won't get exec'd later in the startup
pythonstartup = os.environ.pop('PYTHONSTARTUP')
with open(pythonstartup) as f:
c.InteractiveShellApp.exec_lines.append(list(f))
except KeyError:
pass

但这看起来很老套。

关于python - 将 'from __future__' 与 ipython 和 PYTHONSTARTUP 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19260119/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com