Переменная окружения PYTHONPATH

19

У меня есть это в моем ~/.profile:

export PYTHONPATH=/home/dev/python-files

В python-filesкаталоге у меня есть несколько проектов, клонированных из git-hub (flask, кривый и py-vgdl).

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

$ python ~/python-files/py-vgdl/examples/gridphysics/frogs.py 
Traceback (most recent call last):
    File "/home/dev/python-files/py-vgdl/examples/gridphysics/frogs.py", line 67, in <module>
        from vgdl.core import VGDLParser
ImportError: No module named vgdl.core

Мне кажется, что я не должен получить эту ошибку, потому что у меня PYTHONPATHнастроена переменная окружения?

Запуск интерактивного переводчика python:

>>> import os
>>> os.environ["PYTHONPATH"]
'/home/dev/python-files'
Джером
источник

Ответы:

35

Попробуйте добавить в PYTHONPATH вместо того, чтобы полностью перезаписать его.

export PYTHONPATH=$PYTHONPATH:/home/dev/python-files

Ссылки:

Согласно документации Python по PYTHONPATH

Дополнить путь поиска по умолчанию для файлов модулей. [...]

Путь поиска по умолчанию зависит от установки, но обычно начинается с prefix/lib/pythonversion(см. PYTHONHOMEВыше). Это всегда добавляется к PYTHONPATH.

Это означает, что некоторые значения существуют, PYTHONPATHи путь поиска по умолчанию также только добавляется.

Кроме того, этот пост в блоге ( ссылка на Archive.org ) также ясно объясняет, почему вы должны добавлять его, PYTHONPATHа не перезаписывать. Прокрутка вниз до раздела - Особые случаи и изучение пути поиска объясняет это ясно (к сожалению, нет относительного URL для этой ссылки, поэтому вам придется прокрутить). Хотя пользователь приводит примеры на Mac, они очень актуальны для любой платформы

Нитин Венкатеш
источник
1
@Garrett Спасибо :) Обновлено со ссылкой на Archive.org.
Нитин Венкатеш
+1 за архив / стереоплексная ссылка. Он отвечает на многие вопросы, которые должны быть на первой странице официальных документов Python!
Малик А. Руми
5

Вы также можете сделать следующее:

export PYTHONPATH=$(pwd) **or** export PYTHONPATH=${PWD}

pwd - это текущий рабочий каталог.

Мрудхвика Дамараджу
источник
Осторожно, это перезапишет ваш PYTHONPATH в процессе! Если вы хотите добавить pwd к вашему PYTHONPATH:export PYTHONPATH=$PYTHONPATH:$(pwd)
jackw11111
4

PYTHONPATHдолжен указывать на то, где находятся ваши пакеты и модули Python, а не на то, где находятся ваши проверки. Другими словами, если вы сделаете это, ls "$PYTHONPATH"вы должны увидеть *.pyфайлы ( модули Python ) и каталоги, содержащие __init__.pyфайлы ( пакеты Python ).

Итак, если вы хотите import vgdl, вы PYTHONPATHдолжны выглядеть так:

PYTHONPATH=/home/dev/python-files/py-vgdl

потому что vgdl пакет внутри py-vgdl, а не внутри python-files.

Чтобы добавить и другие пути, вы можете использовать их :для разделения:

PYTHONPATH="/home/dev/python-files/py-vgdl:/home/dev/python-files/something:$PYTHONPATH"

Это действительно будет работать, однако, для таких случаев, использование PYTHONPATHможет быть слишком сложным. Я рекомендую использовать virtualenv, что сделано специально для упрощения ситуаций, подобных вашей. Что вам нужно сделать, это в основном:

  1. Создать среду: virtualenv env
  2. «Активировать» это: source env/bin/activate
  3. Установите свои пакеты: это может быть сделано либо с помощью pipили setup.pyсценарий ваших пакетов.
  4. Наслаждаться.

Я не даю много информации, потому что virtualenv хорошо документирована, и если вам нужна помощь с чем-то, вам лучше открыть новый вопрос.

Андреа Корбеллини
источник