Переменные среды в Python на Linux

В 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

13
задан animuson 6 July 2014 в 09:31
поделиться

5 ответов

Это - очень хороший вопрос.

оказывается, что os модуль инициализирует os.environ к значению posix .environ, который установлен на запуске интерпретатора. Другими словами, стандартная библиотека, кажется, не обеспечивает доступ к функция getenv.

, Который является случаем, где, вероятно, было бы безопасно использовать ctypes на Unix. Так как Вы назвали бы ультрастандарт libc функцией.

14
ответ дан ddaa 6 July 2014 в 09:31
поделиться

Можно использовать ctypes, чтобы сделать это симпатичное просто:

>>> from ctypes import CDLL, c_char_p
>>> getenv = CDLL("libc.so.6").getenv
>>> getenv.restype = c_char_p
>>> getenv("HOME")
'/home/glyph'
11
ответ дан Glyph 6 July 2014 в 09:31
поделиться

Другая возможность состоит в том, чтобы использовать pdb или некоторый другой отладчик Python вместо этого, и изменить os.environ на уровне Python, а не уровне C. Вот маленький рецепт, который я отправил, чтобы прервать рабочий процесс Python и обеспечить доступ к консоли Python при получении сигнала. С другой стороны, просто засуньте pdb.set_trace () в какой-то момент в Вашем коде, который Вы хотите прервать. В любом случае, просто выполняет оператор "import os; os.environ['SOME_VARIABLE']='my_value'", и Вы должны быть обновлены, что касается Python.

я не уверен, обновит ли это также среду C с setenv, поэтому если у Вас есть модули C с помощью getenv непосредственно, Вам, вероятно, придется сделать еще некоторую работу для хранения этого в синхронизации.

4
ответ дан Community 6 July 2014 в 09:31
поделиться

Я не полагаю, что много программ КОГДА-ЛИБО ожидают изменять свою среду внешне, так загрузка копии переданной среды при запуске эквивалентна. Вы просто наткнулись на выбор реализации.

, Если Вы видите все значения набора в запуске и putenv/setenv из Ваших работ программы, я не думаю, что существует что-либо, чтобы касаться. Существуют намного более чистые способы передать обновленную информацию рабочим исполняемым файлам.

3
ответ дан 6 July 2014 в 09:31
поделиться

Рассмотрение исходного кода (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, который всегда вызывает системный вызов.

1
ответ дан Thomas Vander Stichele 6 July 2014 в 09:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: