当我运行python3 -i file.py时会发生什么

时间:2017-06-30 04:46:44

标签: macos python-3.x read-eval-print-loop

让我们说test.py有内容

i_am_a_variable = 1
i_am_also_a_var = 2

while True:
    input('> ')

然后,在与test.py相同的目录中,我运行python3。然后,在REPL中,我执行from test import *。由于Python 3 REPL具有自动完成功能,因此变量实际上也在此无限input循环中自动完成。也就是说,当我跑

$ python3
>>> from test import *
> i_am_a|

|代表我的光标)如果我按Tab键,好像我的光标位于第i_am_a行的末尾,它将自动完成i_am_a_variable

现在,如果我运行python3 -i test.py,则不会发生此行为。也就是说,REPL不会自动完成。那么当我运行python3 -i test.py时到底发生了什么。 test.py只是运行然后globals被复制到REPL吗?

这是在macOS上测试的,以防自动完成在其他python发行版上不可用。 感谢。

2 个答案:

答案 0 :(得分:2)

Python在输入交互模式时初始化自动完成。 (如果您需要详细信息,则会调用sys.__interactivehook__,默认__interactivehook__执行的操作之一是导入rlcompleter并配置TAB以触发完成。)

当您以交互模式启动Python然后以交互方式运行from test import *时,Python会在它到达input循环之前启用自动完成功能。自动填充并不是真正意图影响input,但它无论如何都会影响。

当您使用test.py运行python3 -i时,Python不会进入交互模式。 计划test.py完成后进入交互模式,计划运行sys.__interactivehook__并在发生这种情况时启用自动完成功能,但{{ 1}}循环在到达该点之前发生。

答案 1 :(得分:0)

在您的代码中执行一个无限循环,它试图读取标准输入,因此它不会自动填充变量,因为脚本控件在您的代码中是为了读取输入,而不是在REPL中。

让我们说test.py

i_am_a_variable = 1
i_am_also_a_var = 2

没有循环,REPL执行代码(python -i test.py)并且自动完成工作,否则不会,因为REPL执行循环的input语句。如果正确的话,上面告诉你自动完成在REPL中通过导入工作将不起作用。

最终的解决方案再现

$ cat test.py
i_am_a_variable = 1
i_am_also_a_var = 2

def Infinite():
    while True:
        input('> ')

$ python3 -i test.py
>>> Infinite()
> i_am_a
i_am_a_variable  i_am_also_a_var  
> i_am_a
i_am_a_variable  i_am_also_a_var  
> i_am_a_variable
> i_am_a
i_am_a_variable  i_am_also_a_var  
> i_am_a
i_am_a_variable  i_am_also_a_var  
> i_am_also_a_var
>