Настройте Python для включения другого каталога при поиске пакетов

Вы сталкиваетесь с переменной проблемой объема. Переменные определили в цикле с условием продолжения, который находится на правой стороне канала, имеют их собственный локальный контекст объема, и изменения в переменной не будут замечены за пределами цикла. Цикл с условием продолжения является по существу подоболочкой, которая получает КОПИЮ среды оболочки, и любые изменения в среде потеряны в конце оболочки. Посмотрите этот вопрос о StackOverflow.

ОБНОВЛЕННЫЙ: Я забыл указывать на важное то, что цикл с условием продолжения со своей собственной подоболочкой происходил из-за него являющийся конечной точкой канала, я обновил это в ответе.

6
25.03.2011, 22:44
2 ответа

(Исправьте ошибки и пропуск по мере необходимости. Спасибо.)

Во-первых, вопрос и комментарий. Я не использую SUSE, поэтому беру это с щепоткой соли. Пакеты, которые устанавливают в/usr/lib/python2.6/site-packages официальных пакетах? Если так, SUSE повреждается, так, чтобы было маловероятно. Если они не официальные пакеты, Вы могли бы или попросить, чтобы поставщики программного блока использовали стандартные пути, или, альтернативно, Вы могли отправить ошибку списка пожеланий SUSE, прося, чтобы они поддерживали этот дополнительный путь. Это сохранит Вас и других людей дополнительные головные боли.

В настоящий момент у Вас есть следующие возможности, в порядке уменьшающегося объема:

  1. Измените путь поиска модуля для всех пользователей (метод 1)

    Измените путь поиска модуля в установке Python.

    Путь поиска модуля по умолчанию предрасположен в двоичный файл. Дополнительные пути могут быть настроены во времени выполнения, например, в site.py файле. Например, Debian использует/usr/lib/python2.6/site.py (для установки python 2.6 по умолчанию) для реализации ее сайт-специфичной конфигурации. Наверху файла записан

    Append module search paths for third-party packages to `sys.path`.
    
    ****************************************************************
    * This module is automatically imported during initialization. *
    ****************************************************************
    [...]
    
    This will append site-specific paths to the module search path.
    

    Патч Debian debian/patches/site-locations.diff говорит

    Для Debian и производных, этот sys.path увеличивается с каталогами для пакетов, распределенных в рамках распределения. Локальные дополнения входят/usr/local/lib/python/dist-packages, дополнительная установка Debian в/usr/{lib, доля}/python/dist-packages./usr/lib/python/site-packages не используется.

    Рассматриваемый патч

                    sitedirs.append(os.path.join(prefix,
    "Lib", "site-packages"))
                 elif os.sep == '/':
        +            sitedirs.append(os.path.join(prefix,
    "local/lib",
        +                                        "python" + sys.version[:3],
        +                                        "dist-packages"))
                     sitedirs.append(os.path.join(prefix,
    "lib",
                                                 "python" + sys.version[:3],
        -                                        "site-packages"))
        -            sitedirs.append(os.path.join(prefix,
    "lib", "site-python"))
        +                                        "dist-packages"))
        +            sitedirs.append(os.path.join(prefix,
    "lib", "dist-python"))
                 else:
                     sitedirs.append(prefix)
                     sitedirs.append(os.path.join(prefix,
    "lib", "site-packages"))
    

    Таким образом, Вы могли изменить site.path в своем системном пакете для создания измененного пути поиска модуля. Вы, вероятно, не хотите к этому, все же. С одной стороны, необходимо будет объединить это в на каждом обновлении пакета Python распределения.

  2. Измените путь поиска модуля для всех пользователей (метод 2)

    Добавьте файл формы something.pth к каталогу, который уже находится в пути поиска, который содержит путь, или относительный или абсолютный. Например.

    /usr/local/lib/python2.6/dist-packages$ cat foo.pth 
    /home/faheem/dummypythonpath
    

    В другом терминале делают

    >>> import sys
    >>> sys.path
        [...,'/home/faheem/dummypythonpath',...,]
    
  3. Измените путь поиска модуля для всех пользователей (метод 3)

    Переменная среды PYTHONPATH обычно используется для добавления к системному пути на уровне пользователя. Можно поместить его в файл, который будет получен всеми пользователями. Например, в Debian у нас есть/etc/bash.bashrc, который говорит наверху

    # System-wide .bashrc file for interactive bash(1) shells.
    
    # To enable the settings / commands in this file for login shells as well,
    # this file has to be sourced in /etc/profile.
    

    Таким образом, Вы могли добавить или PYTHONPATH там. Вы, вероятно, хотите, чтобы это было получено и для входа в систему и для интерактивных оболочек, таким образом, Вы захотите проверить это. К сожалению, дистрибутивы часто облуплены о включении этого.

    Пути в PYTHONPATH добавляются к списку по умолчанию путей поиска в системе (который может быть получен, например, sys.path - посмотрите ниже). При обеспечении возможности, что PYTHONPATH уже установлен, просто добавьте желаемые дополнительные каталоги к нему, например.

    export PYTHONPATH=$PYTHONPATH:"/home/username/lib/python2.6/dist-packages"
    

    Если Вы получите переменную PYTHONPATH и затем проверите sys.path снова, то Вы будете
    посмотрите, что пути были добавлены. Обратите внимание что положение в который пути в
    PYTHONPATH добавляются к существующим ранее путям, кажется, не предписан
    реализация.

  4. Измените путь поиска модуля на пользователя.

    Обычный путь состоит в том, чтобы изменить PYTHONPATH в bashrc пользователя, а именно, ~/.bashrc. Снова, проверьте, что это получено и для входа в систему и для интерактивных оболочек.

  5. Измените путь поиска модуля на на основание сценария. Это сделано путем добавления к sys.path, а именно,

    import sys
    sys.path.append(some_additional_path)
    

    Это будет только работать на сценарий, который импортирует это. Это обычно используется, насколько я знаю, для случайного использования, при импорте модулей в нестандартных местоположениях, как от куда-нибудь в корневом каталоге.

См. также Greg Ward при Изменении Пути поиска Python. Это имеет хорошее обсуждение доступных альтернатив.

6
27.01.2020, 20:25
  • 1
    Пакеты для openSUSE, и я устанавливаю их на SLES. Фиксация пакетов является правильным способом сделать это, но мне все еще любопытно на предмет ответа на вопрос. –  Lorin Hochstein 27.03.2011, 07:03

Использовать sys.path:

import sys
sys.path.append("/home/me/mypy")

Можно также проверить site документация модуля, которая объясняет, как сайт-специфичные пути вычисляются.

3
27.01.2020, 20:25

Теги

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