Estou desenvolvendo / testando um pacote em meu diretório local. Quero importá-lo no interpretador (v2.5), mas sys.path não inclui o diretório atual. Agora eu digito sys.path.insert(0,'.')
. Existe uma maneira melhor?
Além disso,
from . import mypackage
falha com este erro:
ValueError: Attempted relative import in non-package
Respostas:
Você pode usar importações relativas apenas de um módulo que por sua vez foi importado como parte de um pacote - seu script ou intérprete interativo não foi, então é claro
from . import
(o que significa "importar do mesmo pacote de onde fui importado") não 't funciona.import mypackage
vai ficar bem depois de garantir o diretório paimypackage
ésys.path
(como você conseguiu obter o seu diretório atual longe dosys.path
que eu não sei? - você tem algo estranho no site.py, ou ...)Para colocar seu diretório atual de volta
sys.path
lá, não há maneira melhor do que colocá-lo lá.fonte
Consulte a documentação para sys.path:
http://docs.python.org/library/sys.html#sys.path
Citar:
Portanto, não há necessidade de mexer com sys.path se você estiver iniciando o interpretador Python a partir do diretório que contém seu módulo.
Além disso, para importar seu pacote, basta fazer:
import mypackage
Como o diretório que contém o pacote já está em sys.path, ele deve funcionar bem.
fonte
sys.path
então os arquivos devem ser encontrados antes dos arquivos em qualquer outro lugar no ambiente de trabalho.sys.path.insert(0, new_path)
ao invés desys.path.append(new_path)
.Se você deseja executar um script python não modificado para importar bibliotecas de um diretório local específico, você pode definir a
PYTHONPATH
variável de ambiente - por exemplo, em bash:Se você deseja apenas importar do diretório de trabalho atual, use a
.
notação:fonte
Mantenha simples:
try: from . import mymodule # "myapp" case except: import mymodule # "__main__" case
fonte
Uma maneira simples de fazer isso funcionar é rodar seu script a partir do diretório pai usando o
-m
sinalizador do python , por exemplopython -m packagename.scriptname
. Obviamente, nesta situação, você precisa de um__init__.py
arquivo para transformar seu diretório em um pacote.fonte
Dentro de um pacote, se houver setup.py , é melhor instalá-lo
fonte
O uso
sys.path
deve incluir o diretório atual já.Tentar:
import .
ou:
from . import sth
no entanto, pode não ser uma boa prática, então por que não usar apenas:
import mypackage
fonte
Um pouco tarde para a festa, mas isso é o que funcionou para mim:
>>> import sys >>> sys.path.insert(0, '')
Aparentemente, se houver uma string vazia, Python sabe que ela deve procurar no diretório atual. Eu não tinha a string vazia
sys.path
, o que causou este erro.fonte
Eu costumava
pathlib
adicionar meu diretório de módulo ao caminho do meu sistema, pois queria evitar a instalação do módulo como um pacote e a resposta do @maninthecomputer não funcionou para mimimport sys from pathlib import Path cwd = str(Path(__file__).parent) sys.path.insert(0, cwd) from my_module import my_function
fonte