adicionando diretório ao sys.path / PYTHONPATH

130

Estou tentando importar um módulo de um diretório específico.

O problema é que, se eu usar sys.path.append(mod_directory)para acrescentar o caminho e abrir o interpretador python, o diretório mod_directoryserá adicionado ao final da lista sys.path. Se eu exportar a PYTHONPATHvariável antes de abrir o interpretador python, o diretório será adicionado ao início da lista. No último caso, posso importar o módulo, mas no primeiro, não posso.

Alguém pode explicar por que isso está acontecendo e me dar uma solução para adicionar mod_directoryo início, dentro de um script python?

UnadulteratedImagination
fonte
Eu tentei sitemódulo .
Zeinab Abbasimazar

Respostas:

178

Isso está funcionando como documentado. Todos os caminhos especificados em PYTHONPATHsão documentados como normalmente vindo após o diretório de trabalho, mas antes dos caminhos fornecidos pelo interpretador padrão. sys.path.append()anexa ao caminho existente. Veja aqui e aqui . Se você deseja que um diretório específico seja o primeiro, insira-o no início do sys.path:

import sys
sys.path.insert(0,'/path/to/mod_directory')

Dito isto, geralmente existem maneiras melhores de gerenciar importações do que usar PYTHONPATHou manipular sys.pathdiretamente. Veja, por exemplo, as respostas para esta pergunta .

Ned Deily
fonte
Obrigado pela resposta. O problema era que eu não sabia que esse módulo para adicionar empacotado como um arquivo .egg você tem que incluir o nome do arquivo em vez de apenas o diretório em Python 2.6
UnadulteratedImagination
2
Ei cara, isso quebrou meu django. Tem certeza de que deseja dizer às pessoas para colocá-lo no topo?!? !!?
R Claven
16
@RClaven, desculpe, é difícil dizer a quais ações e resultados você está se referindo: "coloque no topo" e "quebrou meu django" não são muito precisos. Você pode elaborar?
Ned Deily
Para saber mais sobre como funciona o sys.path, consulte esta resposta stackoverflow.com/a/38403654/850326
djhaskin987
2
Você realmente deve usar "1" em vez de "0"! Caso contrário, você interrompe o sys.path . Consulte também stackoverflow.com/q/10095037/125507 .
22418 Kadee
9

Você poderia usar:

import os
path = 'the path you want'
os.environ['PATH'] += ':'+path
Δημητρης Παππάς
fonte
você precisa ';' no windows.
sanjivgupta 5/07
6

Quanto a mim, eu preciso caffe para o meu caminho python. Eu posso adicionar o caminho para o arquivo /home/xy/.bashrcadicionando

export PYTHONPATH=/home/xy/caffe-master/python:$PYTHONPATH.

para o meu /home/xy/.bashrc arquivo.

Mas quando eu uso pycharm, o caminho ainda não está.

Para que eu possa adicionar o caminho à PYTHONPATHvariável, execute -> editar Configuração.

insira a descrição da imagem aqui

Jayhello
fonte
O mais simples é a melhor resposta, adicione este para o desenvolvimento vai fazer o trabalho autocomplete
Gang
Atualizei o .bashrc conforme explicado acima, mas não refleti no bloco de anotações jupyter. O notebook Jupyter ainda diz que o módulo não foi encontrado.
Athar
3

A alteração temporária de diretórios funciona bem para a importação:

cwd = os.getcwd()
os.chdir(<module_path>)
import <module>
os.chdir(cwd)
user3517603
fonte
0

Ao executar um script Python do Powershell no Windows, isso deve funcionar:

$pathToSourceRoot = "C:/Users/Steve/YourCode"
$env:PYTHONPATH = "$($pathToSourceRoot);$($pathToSourceRoot)/subdirs_if_required"

# Now run the actual script
python your_script.py
Alexander Pacha
fonte