如何使readline在python子进程中工作?

时间:2018-09-04 15:04:39

标签: python subprocess readline serverless-framework pdb

我花了很多钱在一个子进程中启用MacOS Sierra上pdb中的readline支持,但我不明白为什么它会失败,因此是问题。

请注意,我在所有python环境(包括python2和3安装)以及在使用pipenv,venv或pew创建的虚拟环境中都没有添加.pdbrc文件的情况下具有适当的readline支持。一切正常。

当我想在子进程中放入pdb shell时出现问题。我使用了一个nodejs program和一个plugin,我用它们来本地调用AWS代码。第一个nodejs进程启动第二个,第二个Nodejs进程启动一个python进程,我在其中包含我通常的pdb代码:

import pdb; pdb.set_trace()

但是我得到的pdb shell没有readline支持。我尝试了以下无效的替代方法:

import ipdb; ipdb.set_trace()
import rlcompleter, readline
readline.parse_and_bind('tab: complete')
readline.parse_and_bind('bind ^I rl_complete')

我还添加了以上内容(减去ipdb导入)的.pdbrc文件,但无济于事。我还尝试将PYTHONSTARTUP指向以下内容的文件:

import rlcompleter, readline
readline.parse_and_bind('tab: complete')

它也没有帮助。人们已经报告说这些解决方案已经为他们工作了,但是他们并没有从一开始就获得readline支持(对我来说,没有这些技巧就可以了)。

我还尝试修补我的nodejs process.env.PATHprocess.env.PYTHONPATH,并添加了我安装了python的目录,这些目录没有对readline的支持。

我很高兴有人能解释从子子进程启动pdb和直接从终端启动pdb(无论如何也都是子进程)之间是否存在根本区别。而且,我很感谢任何建议可以帮助我解决这个问题。

更新我

我注意到,即使没有pdb,我也无法获得readline支持:

import code
code.interact(local=locals())

如果运行上面的代码,我会得到一个没有readline支持的python shell:

Python 3.7.0 (default, Jun 29 2018, 20:13:13)
[Clang 9.1.0 (clang-902.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)

>>>
<pointer blinks here which is strange, it should be on the line above>

更新II

网络上的一些相关线程:

更新III

在对问题进行了思考并感谢georgexsh的评论后,我认为我的问题归结为从nodejs启动交互式python REPL。它必须在自己的进程中运行,并且应将按TAB键的输入发送到python进程,并将其标准输出打印在屏幕上。在nodejs中,下面的oneliner可以做到:

require("repl").start("node> ")

1 个答案:

答案 0 :(得分:1)

HasForeignKey

为我工作。