Я потратил довольно много времени на поддержку readline в pdb на MacOS Sierra в подпроцессе, который я не понимаю, почему он не работает, поэтому возникает вопрос.
Обратите внимание, что у меня есть правильная поддержка readline без добавления файла .pdbrc
во всех моих средах python, включая установки python2 и 3, а также в виртуальных средах, созданных с помощью pipenv, venv или pew. Все работает просто отлично.
Проблема возникает, когда я хочу попасть в оболочку pdb в подпроцессе. Я использую программу nodejs вместе с плагином , который я использую для локального вызова кода AWS. Первый процесс nodejs запускает второй, а второй запускает процесс python, в котором есть мой обычный код pdb:
import pdb; pdb.set_trace()
Однако оболочка pdb, которую я получаю, не поддерживает readline. Я попробовал следующие варианты, которые также не работали:
import ipdb; ipdb.set_trace()
import rlcompleter, readline
readline.parse_and_bind('tab: complete')
readline.parse_and_bind('bind ^I rl_complete')
Я также добавил .pdbrc
файл с указанным выше содержимым (без импорта ipdb), но безрезультатно. Я также попытался установить PYTHONSTARTUP
указать файл с таким содержанием:
import rlcompleter, readline
readline.parse_and_bind('tab: complete')
Это тоже не помогло. Люди сообщали, что эти решения сработали для них, но у них не было поддержки readline для начала (что для меня это прекрасно работает без этих уловок).
Я также попытался пропатчить мои nodejs process.env.PATH
и process.env.PYTHONPATH
и добавил каталоги, где у меня есть установка python, с поддержкой readline, но безрезультатно.
Буду признателен, если кто-нибудь сможет объяснить, есть ли принципиальная разница между запуском pdb из процесса sub-sub -...- и напрямую из терминала (который в любом случае это тоже подпроцесс). Более того, я ценю любые предложения, которые могут помочь мне решить эту проблему.
Обновление I
Я заметил, что даже без pdb я не получаю поддержку readline:
import code
code.interact(local=locals())
Если я запускаю приведенный выше код, я получаю оболочку Python без поддержки readline:
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, я думаю, что моя проблема сводится к запуску интерактивного Python REPL из nodejs. Он должен работать в своем собственном процессе, и вводимые данные, такие как нажатие клавиши TAB, должны отправляться процессу python, а его стандартный вывод выводиться на экран. В nodejs это сделает следующий пользователь:
require("repl").start("node> ")