Я недавно установил новый virtualenv для Python 3.5 в Ubuntu 16.04, и всякий раз, когда я ввожу оболочку python в терминал (набирая «python3»), у меня нет постоянной истории команд, которые я вводил в терминал ранее.
В обычной системе python3 постоянная история команд работает нормально и не требует специальной настройки. Как я могу включить его для virtualenv?
Если я активирую virtualenv и наберу «which python3», он покажет мне $ virtualenvpath / bin / python3. Однако я не устанавливал отдельную версию Python. Чтобы настроить virtualenv, я набрал «virtualenv --system-site-packages -p python3 $ virtualenvpath» (из инструкций по установке Tensorflow: tenorflow.org/install/install_linux#InstallingVirtualenv) Кроме того, все остальное в virtualenv работает нормально. Я также убедился, что readline установлен в virtualenv.
Странный. Что произойдет, если вы запустите import readline
в своем виртуальном окружении? А как насчет import site
; это на что-нибудь влияет?
Ни импорт не вызывает ошибку, ни на что не влияет
Похоже, либо вы на самом деле не используете Python 3, либо что-то мешает нормальной работе модуля site
. Есть несколько параметров командной строки, которые могут вызвать это, или это может быть какая-то часть тензорного потока, о котором я не знаю, или файл с именем site.py
или пакет с именем site
могут мешать чему-то.
Я определенно в python3. Как я уже сказал, все остальное работает отлично, я просто не могу вспомнить команды из предыдущих оболочек python3. Чтобы уточнить, у меня есть история команд в оболочке, но она очищается, когда я завершаю оболочку.
Кроме того, я могу импортировать модуль сайта и убедиться, что он правильный.
«Чтобы уточнить, у меня есть история команд в оболочке» - это было бы полезно узнать раньше. Теперь, когда я это знаю, я могу видеть те части вашего сообщения, где вы пытались это сказать, но это было совсем неясно.
Очевидно, virtualenv использует собственный пользовательский site.py, который не очень хорошо синхронизировался с изменениями в "обычном" site.py. Похоже, это одна из несовместимостей. Возможно, вам придется настроить файл истории чтения строки самостоятельно.
Как вы сказали, я обнаружил, что мне нужно настроить его вручную. По иронии судьбы, я нашел ответ на вопрос, как это отключить (но я изменил длину истории, чтобы она была ненулевой): unix.stackexchange.com/a/121390 Я могу подтвердить, что это работает
Однако было бы предпочтительнее найти общее решение - оно не масштабируется, поскольку я должен сказать всем пользователям virtualenv создать файл .pythonrc в их домашнем каталоге, который настраивает историю, а затем добавить «export PYTHONSTARTUP = ~ / .pythonrc "в их .bashrc или .profile.
Поскольку ответ скрыт в комментариях и поэтому его трудно найти:
Из https://unix.stackexchange.com/a/121390 из комментария @ Jason:
Создайте файл .pythonrc.py
:
import os
import atexit
import readline
readline_history_file = os.path.join(
os.path.expanduser('~'),
'.python_history'
)
try:
readline.read_history_file(readline_history_file)
except IOError:
pass
atexit.register(readline.write_history_file, readline_history_file)
и экспортируйте его, добавив в ~/.bashrc
следующую строку:
export PYTHONSTARTUP=$HOME/.pythonrc.py
Ваш virtualenv нет использует систему python3? Вы установили отдельную версию Python? Если да, то как вы это сделали? Похоже, вам не хватает
readline
; лучший способ исправить это, в первую очередь, зависит от того, как вы все настраиваете.