Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Função global

Olá.

Dada a seguinte "estrutura" de pacotes:

./projeto
    /___init__.py
    /arquivo_python1.py
    /arquivo_python2.py
    /...

Gostaria de realizar uma função no init.py, e deixa-la disponível para todos os outros pacotes python.

__init__.py:

    def fazerAlgo():
        print("Fazendo algo")

dentro do "arquivo_python1.py", gostaria de utilizar essa função nativamente. Existe alguma forma de fazer isso?

7 respostas

Pelo que eu entendi você quer importar a função.

Faça o seguinte: no início seu "arquivo_python1.py" digite:

from __init__ import fazerAlgo

porém, eu não tenho certeza se é boa pratica fazer isso. Pesquisando um pouco eu encontrei algo sobre referencias intra-pacotes. No caso, eu acho que você pode substituir a expressão por:

from . import fazerAlgo

mas eu também não sei se isso é correto. Vê se funciona pra você, ou podemos esperar a resposta de algum professor também, fiquei curioso agora.

O correto dentro do padrão da linguagem é

importando tudo:

import  ___init__.py

Vc tb pode importar só o que precisa:

from arquivo_python1 import fazerAlgo

Ou ainda :

from arquivo_python1 import *

obs: importa tudo

Como referencia sobre o assunto em inglês;

1)https://docs.python.org/3/reference/import.html

2) https://www.python.org/dev/peps/pep-0420/

3) https://www.python.org/dev/peps/pep-0328/

@Phelippe:

Eu tentei fazer desta forma, porém também não funcionou. Mas a ideia seria deixar essa "função" nativa no projeto, onde de qualquer arquivo do projeto eu consiga acessar "fazerAlgo" sem realizar o import (se possível).

Se for necessário ler um script adicional de inicialização a partir do diretório atual, você pode programar isso a partir do script de inicialização global, por exemplo if os.path.isfile('.pythonrc.py'): execfile('.pythonrc.py'). Se você deseja utilizar o script de inicialização em outro script, você deve fazê-lo explicitamente da seguinte forma:

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
     execfile(filename)

FONTE: http://turing.com.br/pydoc/2.7/tutorial/interpreter.html

http://python-reference.readthedocs.io/en/latest/docs/functions/execfile.html

@Welton

Obrigado pelas informações, porém pelo li, esse script de inicialização só funciona no modo interativo, e eu também teria que mexer na enviroment, correto?

Gostaria de deixar esta função global, onde de qualquer package eu possa chamar "fazerAlgo" nativamente.

Vc pode tentar assim tb:

def sua_def():
    pass

globals()["def"] = sua_def

Criando um variável global com a sua função!

solução!

@Welton, não consegui fazer funcionar dessa forma no init, então optei por criar um módulo de configuração, e os outros a importam para utiliza-lá.