Как заставить readline работать в подпроцессе python? - PullRequest
0 голосов
/ 04 сентября 2018

Я потратил довольно много времени на поддержку 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> ")

1 Ответ

0 голосов
/ 13 сентября 2018
const ChildProcess = require('child_process');                                 

const ret = ChildProcess.spawnSync('python', [], { stdio: 'inherit' }); 

у меня работает.

...