使用'from __future__'与ipython和PYTHONSTARTUP

use*_*806 2 python ipython python-2.7

我想拥有

from __future__ import (absolute_import, division, print_function, unicode_literals)
Run Code Online (Sandbox Code Playgroud)

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

aba*_*ert 7

这里有两个问题.


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

$ echo -e 'print "PYTHONSTARTUP!"\n' > pythonstartup.py
$ PYTHONSTARTUP=./pythonstartup.py ipython
Run Code Online (Sandbox Code Playgroud)

没有额外的东西被打印出来.


#2706建议应该这样做,#3569修补它,1.1.0似乎是第一个带有更改的版本.

因此,修复是升级到1.1.0.或者,如果您遇到旧版本,请执行#2706中建议的操作,并将其添加到您的第一个$IPYTHONDIR/profile_default/startup/*py文件中:

import os

if os.environ['PYTHONSTARTUP']:
    execfile(os.environ['PYTHONSTARTUP'])
Run Code Online (Sandbox Code Playgroud)

但是,这仍然无法解决问题.

$PYTHONSTARTUP运行方式(由您显式或由iPython隐式)等效于exec.它确实明确地给出了适当globalsexec,这确保你最终print_function得到可用的元组......但这不会影响解析器.(比较输入exec('from __future__ import print_function)`在交互式shell上.)

对于上面描述的启动文件,反向compat ipython.rc文件(如果已启用)以及应该在交互式环境中执行的任何其他文件也是如此 - 它们实际上只是exec在你的globals,这不是一回事.

甚至exec_files在您ipython_config.py或其他app-config脚本中作为机制的一部分执行的文件也是以这种方式处理的.

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


编辑或创建~/.ipython/profile_default/ipython_config.py.(如果您使用的是其他个人资料,ipythondir,应用程序名称等,您可能知道这一点,并且知道如何调整.)

如果它尚未存在,请添加以下行:

c = get_config()
Run Code Online (Sandbox Code Playgroud)

然后添加:

c.InteractiveShellApp.exec_lines = ['from __future__ import print_function']
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅配置ipython命令行应用程序.


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

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
Run Code Online (Sandbox Code Playgroud)

但这看起来很糟糕.