Importar arquivo de outra pasta subindo um nível

3,474 views
Skip to first unread message

Marlysson Silva

unread,
Jun 21, 2016, 10:37:43 AM6/21/16
to Python Brasil

Pessoal estou tentando importar em um arquivo alguns códigos de outro arquivo, só que o outro está em outra pasta no mesmo nível hierárquico da que estou, já tentei imports relativos.
Já utilizei o sys.path e funcionou só que li aqui que não é uma boa prática setar manualmente o path pois poluia o namespace. Aqui está a estrutura que tenho.


Ai de dentro de testes, por exemplo de test_cliente tento fazer assim:

from modelo.cliente import Cliente

from ..modelo.cliente import Cliente

from ...modelo.cliente import Cliente

E nenhuma funciona, mostra:

Parent module " " not loaded cannot perform relative import



Paul Eipper

unread,
Jun 21, 2016, 1:02:46 PM6/21/16
to python-brasil
A forma mais simples é fazer da pasta `testes` um módulo, criando um
arquivo `__init__.py` nela, e executar o código a partir da pasta pai.

--
Paul Eipper
> --
> --
> ------------------------------------
> Grupo Python-Brasil
> http://www.python.org.br/wiki/AntesDePerguntar
>
> <*> Para visitar o site do grupo na web, acesse:
> http://groups.google.com/group/python-brasil
>
> <*> Para sair deste grupo, envie um e-mail para:
> python-brasi...@googlegroups.com
>
> ---
> Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos
> Grupos do Google.
> Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie
> um e-mail para python-brasi...@googlegroups.com.
> Para mais opções, acesse https://groups.google.com/d/optout.

Marlysson Silva

unread,
Jun 21, 2016, 6:59:49 PM6/21/16
to Python Brasil
O negócio que executo de dentro de testes, e lá faço os imports do modelo, eles que não ta dando de importar pro testes.

Paul Eipper

unread,
Jun 21, 2016, 7:16:11 PM6/21/16
to python-brasil
Algum motivo específico para executar de dentro de testes?

--
Paul Eipper

Marlysson Silva

unread,
Jun 22, 2016, 6:23:50 AM6/22/16
to Python Brasil
Eu tenho a suite de teste de cada classe de modelo, e nos testes de cada uma importo o modelo e testo o seu comportamento, e no final coloco:

if __name__ == "__main__":
    unittest
.main()


Assim precisaria importar os modelos de outro nível para poder executar os testes com o comportamento esperado.

Linux - Junior Polegato

unread,
Jun 22, 2016, 8:05:51 AM6/22/16
to python...@googlegroups.com
Em 22-06-2016 07:23, Marlysson Silva escreveu:
Eu tenho a suite de teste de cada classe de modelo, e nos testes de cada uma importo o modelo e testo o seu comportamento, e no final coloco:

if __name__ == "__main__":
    unittest
.main()


Assim precisaria importar os modelos de outro nível para poder executar os testes com o comportamento esperado.

Olá!

        Estruturar melhor e chamar o código da pasta pai é sempre a melhor saída, mas às vezes a gente não quer isso, então vejo três saídas:

1. Módulo imp:

import imp
util = imp.load_source('util', '../dir1/util.py')
util.testar()


2. Link simbólico (ln -s) no Linux (não sei no Windows):

user@machine:~/proj/dir/dir2$ ln -s ../dir1/util.py

import util
util.testar()


3. Adicionar o caminho no sistema de procura pelos módulo:

import sys
sys.path.append('../dir1')
import util
util.testar()

-- 

[]'s

Junior Polegato

Marlysson Silva

unread,
Jun 22, 2016, 8:17:18 AM6/22/16
to Python Brasil
Ok, ter um modelo que tem o próprio teste dele na classe?
Ou tipo, tem os modelos e os arquivos de teste na mesma pasta dos modelos, e assim poder importar dos testes os modelos de um mesmo nível..

Estou usando a última opção, adicionando o caminho do projeto ao path dos testes e de lá importando os modelos , já que estarão disponíveis no escopo, ai faço.
Estrutura :
Projeto
---modelo
---testes
--------test_modelo1
--------test_modelo2


Ai uso dentro do test_*

from modelo.nome_modelo import Classe_Modelo

Linux - Junior Polegato

unread,
Jun 22, 2016, 8:53:57 AM6/22/16
to python...@googlegroups.com
Em 22-06-2016 09:17, Marlysson Silva escreveu:
Ok, ter um modelo que tem o próprio teste dele na classe?
Ou tipo, tem os modelos e os arquivos de teste na mesma pasta dos modelos, e assim poder importar dos testes os modelos de um mesmo nível..
Estou usando a última opção, adicionando o caminho do projeto ao path dos testes e de lá importando os modelos , já que estarão disponíveis no escopo, ai faço.
Estrutura :
Projeto
---modelo
---testes
--------test_modelo1
--------test_modelo2
Ai uso dentro do test_*
from modelo.nome_modelo import Classe_Modelo

Então, o correto seria ter o arquivo __init.py__ dentro de testes, aí em cada test_*.py fazer um dos imports:

import
modelo from modelo import cliente from modelo.cliente import Cliente


E depois executar na pasta do projeto um dos testes:


python
-m unittest testes.test_cliente

python
-m unittest
testes.test_cliente.ClienteTest

python
-m unittest
testes.test_cliente.ClienteTest.test_func

Ou todos os testes:

python
-m unittest discover

--
[]'s
Junior Polegato

Linux - Junior Polegato

unread,
Jun 22, 2016, 8:59:23 AM6/22/16
to python...@googlegroups.com
Olá!

A formatação não ficou legal, vou tentar de novo:


Então, o correto seria ter o arquivo __init.py__ dentro de testes, aí em cada test_*.py fazer um dos imports:

import modelo
from modelo import cliente
from modelo.cliente import Cliente

E depois executar na pasta do projeto um dos testes:

python -m unittest testes.test_cliente
python -m unittest testes.test_cliente.ClienteTest
python -m unittest testes.test_cliente.ClienteTest.test_func

Ou todos os testes ("-s pasta" se pasta não for "tests" e -p "teste_*.py" se os arquivos não forem "test_*.py"):

python -m unittest discover -s testes



-- 

[]'s

Junior Polegato
Message has been deleted

Marlysson Silva

unread,
Jun 22, 2016, 9:11:23 AM6/22/16
to Python Brasil
Interessante, eu tinha adicionado o __init__.py no testes e tentado fazer imports relativos, por exemplo : from ..modelo import Modelo , mas não tinha dado certo. Tenho que dá uma boa olhada nessa parte de imports relativos, se é o que to pensando mesmo.
Reply all
Reply to author
Forward
0 new messages