Добавление каталога в PYTHONPATH приводит к добавлению и моего домашнего каталога

Добавление каталога в PYTHONPATH приводит к добавлению и моего домашнего каталога

Я попробовал добавить каталог /home/myname/binв PYTHONPATH, вставив следующее в мой файл .bashrc:

if [ -d ~/bin ]; then
    export PYTHONPATH=$PYTHONPATH:/home/myname/bin
fi

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

>>> import sys
>>> sys.path

['', '/home/myname', '/home/myname/bin', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages']

Обратите внимание, что echo $PYTHONPATHвозвращается только :/home/myname/bin.

решение1

Проблема в том, что вы включаете существующее значение PYTHONPATH. Однако эта переменная не установлена, поэтому она вычисляется как пустая строка. По какой-то причине это заставляет pythonвключить ваш $HOMEкаталог. Предположительно, это каталог по умолчанию:

$ python -c 'import sys; print sys.path'
['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PILcompat', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/wx-3.0-gtk2']

Однако если я установлю PYTHONPATHпустую строку, то my $HOMEбудет включен:

$ PYTHONPATH=""; python -c 'import sys; print sys.path'
['', '/home/terdon', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PILcompat', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/wx-3.0-gtk2']

Итак, когда вы включаете текущее значение PYTHONPATHпри его установке, вот такое поведение вы получаете:

$ PYTHONPATH="$PYTHONPATH:$HOME/bin" python -c 'import sys; print sys.path'
['', '/home/terdon', '/home/terdon/bin', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PILcompat', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/wx-3.0-gtk2']

Правильный способ настройки — указать только те каталоги, которые вы хотите добавить:

$ PYTHONPATH="$HOME/bin" python -c 'import sys; print sys.path'
['', '/home/terdon/bin', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PILcompat', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/wx-3.0-gtk2']

Или, чтобы быть уверенным в том, что он когда-нибудь будет определен, проверьте, пуст ли он, и действуйте соответствующим образом:

if [ -d ~/bin ]; then
    [ -z "$PYTHONPATH" ] && 
        export PYTHONPATH="/home/myname/bin" ||
        export PYTHONPATH="$PYTHONPATH:/home/myname/bin"
fi

Связанный контент