В OS X, используя python 3.5 и virtualenv
$ pip install gnureadline
В интерпретаторе do:
import gnureadline
Теперь клавиши со стрелками должны работать правильно.
Дополнительная информация ...
Обратите внимание, что с 1 октября 2015 года readline был очищен (источник https://github.com/ludwigschwardt/ python-readline )
Вместо этого используйте gnureadline (см. https://github.com/ludwigschwardt/python-gnureadline )
Если Я устанавливаю readline вместо gnureadline с использованием python 3.5, я получаю ошибки после попытки импорта в интерпретаторе:
>>> import readline
Traceback (most recent call last):
File "", line 1, in
ImportError: dlopen(/Users/pi/tmp/python-readline-test/.venv/lib/python3.5/readline.so, 2): Library not loaded: /usr/local/opt/readline/lib/libreadline.6.dylib
Referenced from: /Users/pi/tmp/python-readline-test/.venv/lib/python3.5/readline.so
Reason: image not found
Это - очень хороший вопрос.
оказывается, что os
модуль инициализирует os.environ
к значению posix
.environ
, который установлен на запуске интерпретатора. Другими словами, стандартная библиотека, кажется, не обеспечивает доступ к функция getenv.
, Который является случаем, где, вероятно, было бы безопасно использовать ctypes на Unix. Так как Вы назвали бы ультрастандарт libc функцией.
Можно использовать ctypes
, чтобы сделать это симпатичное просто:
>>> from ctypes import CDLL, c_char_p
>>> getenv = CDLL("libc.so.6").getenv
>>> getenv.restype = c_char_p
>>> getenv("HOME")
'/home/glyph'
Другая возможность состоит в том, чтобы использовать pdb или некоторый другой отладчик Python вместо этого, и изменить os.environ на уровне Python, а не уровне C. Вот маленький рецепт, который я отправил, чтобы прервать рабочий процесс Python и обеспечить доступ к консоли Python при получении сигнала. С другой стороны, просто засуньте pdb.set_trace () в какой-то момент в Вашем коде, который Вы хотите прервать. В любом случае, просто выполняет оператор "import os; os.environ['SOME_VARIABLE']='my_value'
", и Вы должны быть обновлены, что касается Python.
я не уверен, обновит ли это также среду C с setenv, поэтому если у Вас есть модули C с помощью getenv непосредственно, Вам, вероятно, придется сделать еще некоторую работу для хранения этого в синхронизации.
Я не полагаю, что много программ КОГДА-ЛИБО ожидают изменять свою среду внешне, так загрузка копии переданной среды при запуске эквивалентна. Вы просто наткнулись на выбор реализации.
, Если Вы видите все значения набора в запуске и putenv/setenv из Ваших работ программы, я не думаю, что существует что-либо, чтобы касаться. Существуют намного более чистые способы передать обновленную информацию рабочим исполняемым файлам.
Рассмотрение исходного кода (2.4.5) Python:
Modules/posixmodule.c получает окружение в convertenviron (), который выполняется при запуске (см. INITFUNC), и хранит среду в определенном для платформы модуле (nt, os2, или posix)
взгляды Lib/os.py sys.builtin_module_names, и импортирует все символы или из posix, nt, или из os2
Так да, это решено при запуске. os.environ не будет полезным здесь.
, Если Вы действительно хотите сделать это, затем самый очевидный подход, который приходит на ум, должен создать Ваш собственный модуль Python на базе С с getenv, который всегда вызывает системный вызов.