Autor Tópico: Módulo Python (2.4 / 2.7) não reconhecido  (Lida 6598 vezes)

Offline bred81

  • Usuário Ubuntu
  • *
  • Mensagens: 971
  • HAN?!
    • Ver perfil
Módulo Python (2.4 / 2.7) não reconhecido
« Online: 25 de Abril de 2014, 16:02 »
Então, encontrei vários casos similares no StackOverflow e até aqui no fórum mas não um que eu me encaixasse.
Eu tenho a seguinte estrutura:
Código: [Selecionar]
pasta_pai/
pasta_pai/pasta1/
pasta_pai/pasta1/script.py
pasta_pai/pasta2/
pasta_pai/pasta2/modules/
pasta_pai/pasta2/modules/python/
pasta_pai/pasta2/modules/python/moduloPai/
pasta_pai/pasta2/modules/python/moduloPai/__init__.py
pasta_pai/pasta2/modules/python/moduloPai/moduloFilho1/
pasta_pai/pasta2/modules/python/moduloPai/moduloFilho1/__init__.py
pasta_pai/pasta2/modules/python/moduloPai/moduloFilho1/modulo1.py
pasta_pai/pasta2/modules/python/moduloPai/moduloFilho2/
pasta_pai/pasta2/modules/python/moduloPai/moduloFilho2/__init__.py
pasta_pai/pasta2/modules/python/moduloPai/moduloFilho2/modulo2.py

Eu preciso rodar o "script.py" mas preciso deixar os módulos que criei nesta estrutura.
No meu script estou chamando assim:
Código: [Selecionar]
#!/usr/bin/python

# -*- coding: utf-8 -*-

import sys
import datetime

# sys.path.append("../modules/python/") -> não posso usar isso pois o python 2.4 não aceita.
from moduloPai.moduloFilho1 import modulo1
from moduloPai.moduloFilho1 import modulo2

Mas continua me dando o erro:
Código: [Selecionar]
Traceback (most recent call last):
  File "./scriptpy", line 9, in <module>
    from  moduloPai.moduloFilho1 import modulo1
ImportError: No module named moduloPai.moduloFilho1

Na documentação do Python que eu encontrei, não tem especificando se essa organização deve ser em pastas abaixo de onde estou executando ou pode ser em qualquer lugar do sistema.
Acredito que deva ser abaixo de onde estou executando (o que não é uma opção) pois o Python não sabe que tem que procurar lá.
Alguma solução para este caso?
« Última modificação: 09 de Maio de 2014, 12:14 por bred81 »
O que o Mario foi fazer no pscicólogo?
- Ele estava passando por uma fase difícil...

Offline irtigor

  • Equipe Ubuntu
  • Usuário Ubuntu
  • *****
  • Mensagens: 4.344
  • Delete, delete, delete!
    • Ver perfil
Re: Módulo Python (2.4 / 2.7) não reconhecido
« Resposta #1 Online: 26 de Abril de 2014, 21:11 »
Acredito que "__init__.py" tem que aparecer em todos os subdiretórios, sem ele no pasta2... e nas outras, a busca deve ser encerrada pelo python. Mas deve funcionar se você linkar moduloPai dentro de pasta1.

Outra coisa é que o sys.path deve funcionar, ou a variável PYTHONPATH, mas o caminho tem que estar correto, então ou usa caminho absoluto ou algo como:

Código: [Selecionar]
filedir = os.path.dirname(os.path.realpath(__file__))
moddir =  os.path.join(filedir, '../pasta2/modules/python/moduloPai')

Com isso no script.py você vai conseguir o caminho correto até ele, independente do diretório atual, então usa o relativo dele até o diretório dos módulos.
« Última modificação: 26 de Abril de 2014, 21:15 por irtigor »

Offline bred81

  • Usuário Ubuntu
  • *
  • Mensagens: 971
  • HAN?!
    • Ver perfil
Re: Módulo Python (2.4 / 2.7) não reconhecido
« Resposta #2 Online: 28 de Abril de 2014, 08:53 »
Nesse caso eu teria que por o __init__.py em na pasta pai das duas pastas, o que, acho, não ficaria uma boa prática.
Eu vou testar umas soluções que encontrei na net e daqui a pouco posto aqui o que escolhi.
O que o Mario foi fazer no pscicólogo?
- Ele estava passando por uma fase difícil...

Offline bred81

  • Usuário Ubuntu
  • *
  • Mensagens: 971
  • HAN?!
    • Ver perfil
Re: Módulo Python (2.4 / 2.7) não reconhecido
« Resposta #3 Online: 09 de Maio de 2014, 12:14 »
Achei a solução:

Citar

Você pode estar fazendo isso de modo elegante utilizando o módulo Imp.

Olhe para as funções find_module e load_module.

find_module: Vai procurar o módulo pelo nome, se a pesquisa for bem sucedida, o valor de retorno é uma tupla de 3 elementos (arquivo, caminho, e descrição).

load_module: Essa função vai carregar o módulo, se o módulo já foi importado então será equivalente a um reload(). Se você conseguir carregar com sucesso o valor de retorno é um objeto apontando para o módulo.

Veja um exemplo:

import imp

f, filename, desc = imp.find_module('Foo', ['/pasta2/modules/python/pasta3/'])
modulo1 = imp.load_module('Foo', f, filename, desc)

modulo1.funcao1()


De: http://pt.stackoverflow.com/questions/14043/como-colocar-um-modulo-python-numa-pasta-diferente-do-meu-script
O que o Mario foi fazer no pscicólogo?
- Ele estava passando por uma fase difícil...