Como adicionar um módulo Python ao syspath?

50

Oi eu tenho uma estrutura de arquivos como este

Folder
   Common
      foo1.py
   TestFolder
      foo2.py

Eu quero importar no foo2.py foo1.py. Eu tentei mas não funciona no Ubuntu:

sys.path.append(os.path.abspath('../../'))
from Common import foo1.py
    
por user284474 23.05.2014 / 09:28

3 respostas

98

Como o python encontra seus módulos

Estritamente tomado, um módulo é um único arquivo python, enquanto um pacote é uma pasta contendo arquivos python, acompanhada por um arquivo (pode estar vazio) chamado __init__.py , para dizer python é um pacote para importar módulos de. Em ambos os casos, os módulos precisam de sua extensão .py , mas a importação é feita sem (veja mais abaixo).

Por padrão, o Python procura por seus módulos e pacotes em $PYTHONPATH .

Para descobrir o que está incluído no $ PYTHONPATH, execute o seguinte código em python (3):

import sys
print(sys.path)

Como adicionar um diretório

Ocasionalmente

Dentro de um arquivo python, você pode adicionar caminho (s) ocasionalmente ao caminho padrão, adicionando as seguintes linhas na seção head do seu aplicativo ou script python:

import sys
sys.path.insert(0, "/path/to/your/package_or_module")

Por exemplo:

se eu tiver uma pasta: /home/myname/pythonfiles e quiser importar o arquivo module_1.py , localizado nesse diretório, adiciono isso à seção head do meu código:

import sys
sys.path.insert(0, "/home/myname/pythonfiles")

E posso simplesmente importar o arquivo module_1.py por:

import module_1

Quando eu crio um pacote e quero importar módulo (s) do pacote, eu preciso criar uma pasta em $PYTHONPATH , contendo os módulos, acompanhados por um (pode ser vazio) arquivo chamado __init__.py

Por exemplo:

Para importar de um pacote (pasta) chamado my_package in /home/myname/pythonfiles , adicione o caminho /home/myname/pythonfiles ao seu $PYTHONPATH , como no exemplo 1, e importe o módulo chamado module_2.py (dentro da pasta do pacote ) simplesmente com: '

from <packagename> import module_2

Adicionando diretórios a $PYTHONPATH permanentemente:

Adicione a seguinte linha ao seu arquivo ~/.profile .

export PYTHONPATH=$PYTHONPATH:/path/you/want/to/add

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 pasta subfolder dentro da pasta packagename :

import packagename.subfolder.module_3

Dado o fato de que todas as subpastas do pacote incluem seu próprio arquivo __init__.py .

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 está no mesmo diretório do script ou do aplicativo, ele é adicionado automaticamente.

Exemplo:

Se eu tiver uma pasta contendo script.py e module.py , posso simplesmente importar o módulo:

import module
    
por Jacob Vlijm 23.05.2014 / 17:48
6

A maneira correta de usar a importação relativa é:

from ..Common import foo1

E você também precisa de um __init__.py em todas as suas pastas.

    
por Sylvain Pineau 23.05.2014 / 09:40
2

NB: 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 o link

Basicamente, a pasta every com código python que você deseja adicionar ao syspath precisa de um arquivo __init__.py. Esses arquivos __init__.py podem estar vazios.

    
por don.joey 24.05.2014 / 10:58

Tags