Обе команды ipython -i
и интерпретатор run -i
в ipython
игнорируют from __future__ import division
в print05.py
сценарии.
$ cat print05.py
from __future__ import division
print(1/2)
В ipython
Консоль:
In [1]: print 1/2
0
In [2]: run -i print05.py
0.5
In [3]: division
Out[3]: _Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192)
In [4]: print 1/2
0
In [5]: from __future__ import division
In [6]: print 1/2
0.5
execfile
и import
дают одинаковый результат:
>>> print 1/2
0
>>> execfile('print05.py')
0.5
>>> print 1/2
0
>>> from __future__ import division
>>> print 1/2
0.5
from __future__ import division
не должен влиять на исходный код из разных модулей, иначе он нарушит код в других модулях, которые не ожидают его присутствия.
Здесь from __future__ import division
имеет эффект:
$ python -i print05.py
0.5
>>> print 1/2
0.5
>>> division
_Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192)
Имя модуля в этом случае __main__
как внутри print05.py
, так и в приглашении.
Здесь первый print 1/2
выполняется в модуле print05
, второй - в модуле __main__
, поэтому он также работает как ожидалось:
$ python -im print05
0.5
>>> print 1/2
0
А вот что-то не так:
$ ipython -i print05.py
0.5
In [1]: division
Out[1]: _Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192)
In [2]: print 1/2
0
Документы для __future__
говорят:
Если интерпретатор запускается с опцией -i, передается скрипт
имя для выполнения, и сценарий включает в себя инструкцию на будущее, он будет
быть активным в интерактивном сеансе, запущенном после
казнены.
Так что это может быть ошибка в ipython
, если его опция -i
пытается эмулировать тот же параметр python.