Eu tenho uma estrutura de arquivos como esta:
Folder
Common
foo1.py
TestFolder
foo2.py
Quero importar para foo2.py
e foo1.py
. Eu tentei, mas não funciona no Ubuntu:
sys.path.append(os.path.abspath('../../'))
from Common import foo1.py
__init__.py
arquivo em sua pasta? é assim que o python cria pacotes e permite importar módulos desse pacote. guide.python-distribute.org/creation.htmlRespostas:
Como o python encontra seus módulos
A rigor, um módulo é um único arquivo python, enquanto um pacote é uma pasta que contém arquivos python, acompanhados por um arquivo (pode estar vazio) nomeado
__init__.py
, para dizer ao python que é um pacote do qual importar módulos. Nos dois casos, os módulos precisam de sua.py
extensão, mas a importação é feita sem (veja mais abaixo).Por padrão, o Python procura seus módulos e pacotes no
$PYTHONPATH
.Para descobrir o que está incluído no $ PYTHONPATH, execute o seguinte código em python (3):
Como adicionar um diretório
Ocasionalmente
De dentro de um arquivo python, você pode adicionar caminhos ocasionalmente ao caminho padrão, adicionando as seguintes linhas na seção principal do aplicativo ou script python:
Por exemplo:
se eu tiver uma pasta:
/home/myname/pythonfiles
e desejar importar o arquivomodule_1.py
, localizado nesse diretório, adicione-o à seção head do meu código:E eu posso simplesmente importar o arquivo
module_1.py
:Quando crio um pacote e quero importar os módulos do pacote, preciso criar uma pasta
$PYTHONPATH
contendo os módulos, acompanhada de um arquivo (pode estar vazio) chamado__init__.py
Por exemplo:
Para importar a partir de um pacote (pasta) chamada
my_package
em/home/myname/pythonfiles
, adicione o/home/myname/pythonfiles
caminho para o seu$PYTHONPATH
, como no exemplo 1, e importar o módulo chamadomodule_2.py
(dentro da pasta do pacote) simplesmente com: `Adicionando diretórios
$PYTHONPATH
permanentemente:Adicione a seguinte linha ao seu
~/.profile
arquivo.Subdiretórios
De dentro de um pacote, os subdiretórios não são incluídos assim; você precisa "encadear" os diretórios. Para importar um módulo
module_3.py
, dentro da pastasubfolder
dentro da pastapackagename
:Dado o fato de que todas as subpastas no pacote incluem seu próprio
__init__.py
arquivo.Quando um módulo está no mesmo diretório que o script ou aplicativo
Não há necessidade de inserir o caminho para um módulo quando ele estiver no mesmo diretório que o script ou aplicativo, ele será adicionado automaticamente.
Exemplo:
Se eu tiver uma pasta contendo
script.py
emodule.py
, eu posso simplesmente importar o módulo:fonte
printenv PYTHONPATH
não é nada?sys.path.append("/path/to/your/package_or_module")
também adiciona um caminho ao padrão e é menos confuso. Em comparação com osys.path.insert(0,...)
que tem0
como primeiro argumento.A maneira correta de usar a importação relativa é:
E você também precisa de um
__init__.py
em todas as suas pastas.fonte
Nota: esta resposta está desatualizada para a versão mais recente do python 3, mas está aqui para a versão anterior. Para mais informações, leia os comentários e https://www.python.org/dev/peps/pep-0420/
Essencialmente, todas as pastas com código python que você deseja adicionar ao syspath precisam de um arquivo __init__.py. Esses arquivos __init__.py podem estar vazios.
fonte
python -c "from pathlib import Path; Path('ns').mkdir(); Path('ns/mod.py').write_text('''print('mod.py')'''); import ns.mod; from shutil import rmtree; rmtree('ns')"
também aqui está alguma documentação relevante, PEP 420, que descreve a adição da semântica pacote namespace