我想
from __future__ import (absolute_import, division, print_function, unicode_literals)
使用PYTHONSTARTUP
文件在每个交互式会话中加载。这适用于基本的python(2.7.5,与Anaconda一起安装),但不适用于ipython(1.0.0,Anaconda)。其他import
语句与ipython一起使用,但__future__
语句只是被忽略(尽管如果我在命令行输入它们它们就可以工作)。这是一个ipython错误,还是我缺少的东西?
答案 0 :(得分:7)
这里有两个问题。
第一个比__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
。它明确地为globals
提供了适当的exec
,这可以确保您最终得到print_function
元组可用...但这不会影响解析器。 (比较在交互式shell中输入exec('from __future__ import print_function
)`。
对于上面描述的启动文件,反向compat ipython.rc
文件(如果已启用),以及应该在交互式环境中执行的任何其他文件,它们也是如此 - 它们是'实际上只是exec
中的globals
d,这不是一回事。
即使作为exec_files
或其他app-config脚本中ipython_config.py
机制的一部分执行的文件也是以这种方式处理的。
但是,作为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
但这看起来很糟糕。