让我们说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发行版上不可用。 感谢。
答案 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
>