Como incluir código Python externo para usar em outros arquivos?


117

Se você tiver uma coleção de métodos em um arquivo, há uma maneira de incluir esses arquivos em outro arquivo, mas chamá-los sem qualquer prefixo (ou seja, prefixo do arquivo)?

Então, se eu tenho:

[Math.py]
def Calculate ( num )

Como posso chamá-lo assim:

[Tool.py]
using Math.py

for i in range ( 5 ) :
    Calculate ( i )

Respostas:


154

Você precisará importar o outro arquivo como um módulo como este:

import Math

Se você não quiser prefixar sua Calculatefunção com o nome do módulo, faça o seguinte:

from Math import Calculate

Se você deseja importar todos os membros de um módulo, faça o seguinte:

from Math import *

Edit: Aqui está um bom capítulo de Dive Into Python que vai um pouco mais a fundo neste tópico.


9
Vale a pena notar que nãofrom Math import * é recomendado .
naught101 de

1
Você pode impmódulo interessante e chamada mágica __import__.
Vitold S.

Alguém se esqueceu de renovar o domínio: \
Spechal

48

Basta escrever o comando "incluir":

import os

def include(filename):
    if os.path.exists(filename): 
        execfile(filename)


include('myfile.py')

@Deleet:

A observação @bfieck está correta, para compatibilidade com python 2 e 3, você precisa de:

Python 2 e 3: alternativa 1

from past.builtins import execfile

execfile('myfile.py')

Python 2 e 3: alternativa 2

exec(compile(open('myfile.py').read()))

3
Existe alguma razão para fazer isso de novo from module import *? Além disso, se o arquivo que você está chamando tiver código no corpo, esse código será executado, se você fizer isso.
naught101 de

4
@ naught101: Esse é o objetivo: executar o código, o que não acontece com uma importação. Normalmente é apenas definir variáveis.
Louis

2
@Deleet python 3 não temexecfile
bfieck

7
Na verdade, python 3 tem outra assinatura para compile()além da mencionada. Portanto, o Python 2 e 3 corretos: a alternativa 2 será:exec(compile(source=open('myfile.py').read(), filename='myfile.py', mode='exec'))
TriAnMan

3
A função auxiliar 'incluir' não funciona se você quiser ter variáveis ​​no arquivo incluído no escopo no chamador de 'incluir'
paulj

35

Se você usar:

import Math

então isso permitirá que você use as funções do Math, mas você deve fazer Math.Calculate, de modo que é obviamente o que você não quer.

Se você deseja importar as funções de um módulo sem ter que prefixá-las, você deve nomeá-las explicitamente, como:

from Math import Calculate, Add, Subtract

Agora, você pode fazer referência a Calculate, Add e Subtract apenas por seus nomes. Se você quiser importar TODAS as funções do Math, faça:

from Math import *

No entanto, você deve ter muito cuidado ao fazer isso com módulos cujo conteúdo não tem certeza. Se você importar dois módulos que contêm definições para o mesmo nome de função, uma função sobrescreverá a outra, sem você saber disso.


1

Achei o módulo de inspeção python muito útil

Por exemplo com teststuff.py

import inspect

def dostuff():
    return __name__

DOSTUFF_SOURCE = inspect.getsource(dostuff)

if __name__ == "__main__":

    dostuff()

E de outro script ou console Python

import teststuff

exec(DOSTUFF_SOURCE)

dostuff()

E agora dostuff deve estar no escopo local e dostuff () retornará o console ou scripts _ nome _ enquanto que a execução de test.dostuff () retornará o nome dos módulos python.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.