Dado o código a seguir, o que if __name__ == "__main__":
faz?
# Threading example
import time, thread
def myfunction(string, sleeptime, lock, *args):
while True:
lock.acquire()
time.sleep(sleeptime)
lock.release()
time.sleep(sleeptime)
if __name__ == "__main__":
lock = thread.allocate_lock()
thread.start_new_thread(myfunction, ("Thread #: 1", 2, lock))
thread.start_new_thread(myfunction, ("Thread #: 2", 2, lock))
python
namespaces
main
python-module
idioms
Dedicado
fonte
fonte
if __name__ == "__main__":
condição do bloco foi descontinuada / obsoleta até o Python 3? Eu encontrei algumas informações afirmando isso.Respostas:
Sempre que o interpretador Python lê um arquivo de origem, ele faz duas coisas:
ele define algumas variáveis especiais como
__name__
e, em seguida,ele executa todo o código encontrado no arquivo.
Vamos ver como isso funciona e como se relaciona à sua pergunta sobre as
__name__
verificações que sempre vemos nos scripts Python.Amostra de código
Vamos usar um exemplo de código um pouco diferente para explorar como as importações e os scripts funcionam. Suponha que o seguinte esteja em um arquivo chamado
foo.py
.Variáveis Especiais
Quando o interpretador Python lê um arquivo de origem, primeiro define algumas variáveis especiais. Nesse caso, nos preocupamos com a
__name__
variável.Quando o seu módulo é o programa principal
Se você estiver executando seu módulo (o arquivo de origem) como o programa principal, por exemplo,
o intérprete atribuirá a string codificada
"__main__"
à__name__
variável, ou seja,Quando seu módulo é importado por outro
Por outro lado, suponha que outro módulo seja o programa principal e importe seu módulo. Isso significa que há uma declaração como essa no programa principal ou em algum outro módulo que o programa principal importa:
O intérprete pesquisará seu
foo.py
arquivo (juntamente com algumas outras variantes) e, antes de executar esse módulo, atribuirá o nome"foo"
da instrução de importação à__name__
variável, ou seja,Executando o código do módulo
Depois que as variáveis especiais são configuradas, o intérprete executa todo o código do módulo, uma instrução de cada vez. Convém abrir outra janela ao lado com o exemplo de código para poder seguir essa explicação.
Sempre
Imprime a string
"before import"
(sem aspas).Ele carrega o
math
módulo e o atribui a uma variável chamadamath
. Isso é equivalente a substituirimport math
pelo seguinte (observe que__import__
é uma função de baixo nível no Python que pega uma string e aciona a importação real):Imprime a string
"before functionA"
.Ele executa o
def
bloco, criando um objeto de função e atribuindo esse objeto de função a uma variável chamadafunctionA
.Imprime a string
"before functionB"
.Ele executa o segundo
def
bloco, criando outro objeto de função e atribuindo-o a uma variável chamadafunctionB
.Imprime a string
"before __name__ guard"
.Somente quando o seu módulo é o programa principal
__name__
foi realmente definido como"__main__"
e chama as duas funções, imprimindo as strings"Function A"
e"Function B 10.0"
.Somente quando seu módulo é importado por outro
__name__
será"foo"
, não"__main__"
e ele ignorará o corpo daif
instrução.Sempre
"after __name__ guard"
nas duas situações.Sumário
Em resumo, eis o que seria impresso nos dois casos:
Por que isso funciona dessa maneira?
Você pode naturalmente se perguntar por que alguém iria querer isso. Bem, às vezes você quer escrever uma
.py
arquivo que possa ser usado por outros programas e / ou módulos como um módulo e também possa ser executado como o próprio programa principal. Exemplos:Seu módulo é uma biblioteca, mas você deseja ter um modo de script no qual ele executa alguns testes de unidade ou uma demonstração.
Seu módulo é usado apenas como um programa principal, mas possui alguns testes de unidade, e a estrutura de teste funciona importando
.py
arquivos como seu script e executando funções especiais de teste. Você não quer que ele execute o script apenas porque está importando o módulo.Seu módulo é usado principalmente como um programa principal, mas também fornece uma API amigável para programadores para usuários avançados.
Além desses exemplos, é elegante que a execução de um script em Python esteja apenas configurando algumas variáveis mágicas e importando o script. "Executar" o script é um efeito colateral da importação do módulo do script.
Alimento para o pensamento
Pergunta: Posso ter vários
__name__
blocos de verificação? Resposta: é estranho fazê-lo, mas o idioma não o impede.Suponha que o seguinte é no
foo2.py
. O que acontece se você disserpython foo2.py
na linha de comando? Por quê?__name__
check-infoo3.py
:fonte
subprocess.run('foo_bar.py')
em um script python? Suponho quefoo_bar
será iniciado__name__ = '__main__'
exatamente como quando digito ofoo_bar.py
cmd manualmente. É esse o caso? Levando em consideração a resposta do @MrFooz ', não deve haver nenhum problema ao fazer isso e ter quantos módulos "principais" por vez quiser. Mesmo alterar o__name__
valor ou ter várias instâncias independentes criadoras (ou instâncias que se criaramsubprocess
) interagem entre si deve ser um negócio normal para o Python. Perco alguma coisa?subprocess.run
. Dito isso, uma maneira geralmente melhor de compartilhar código entre scripts é criar módulos e fazer com que os scripts chamem os módulos compartilhados em vez de se invocarem como scripts. É difícil de depuraçãosubprocess.run
chamadas desde que a maioria dos depuradores não saltar em limites de processo, ele pode adicionar a sobrecarga do sistema não-trivial para criar e destruir os processos extra, etc.from foo2 import functionB
importar foo2 da functionB? Essa é uma contorção semântica.from module import method
importa o método do módulo.multiprocessing
, em particular, tornar esse teste necessário no Windows.Quando seu script é executado, passando-o como um comando para o intérprete Python,
todo o código que está no nível de indentação 0 é executado. Funções e classes definidas são, bem, definidas, mas nenhum código é executado. Ao contrário de outros idiomas, não há
main()
função que seja executada automaticamente - amain()
função é implicitamente todo o código no nível superior.Nesse caso, o código de nível superior é um
if
bloco.__name__
é uma variável interna que avalia o nome do módulo atual. No entanto, se um módulo estiver sendo executado diretamente (comomyscript.py
acima),__name__
será definido como a sequência"__main__"
. Portanto, você pode testar se seu script está sendo executado diretamente ou se está sendo importado por outra coisa testandoSe o seu script estiver sendo importado para outro módulo, suas várias definições de função e classe serão importadas e seu código de nível superior será executado, mas o código no corpo da
if
cláusula acima não será executado conforme a condição não conheceu. Como um exemplo básico, considere os dois scripts a seguir:Agora, se você chamar o intérprete como
A saída será
Se você executar
two.py
:Você recebe
Assim, quando o módulo
one
é carregado, é__name__
igual ao"one"
invés de"__main__"
.fonte
A explicação mais simples para a
__name__
variável (imho) é a seguinte:Crie os seguintes arquivos.
e
Ao executá-los, você obtém esta saída:
Como você pode ver, quando um módulo é importado, o Python define
globals()['__name__']
nesse módulo o nome do módulo. Além disso, na importação, todo o código do módulo está sendo executado. Como aif
instrução é avaliada paraFalse
esta parte, não é executada.Como você pode ver, quando um arquivo é executado, o Python define
globals()['__name__']
nesse arquivo como"__main__"
. Desta vez, aif
instrução é avaliadaTrue
e está sendo executada.fonte
Para descrever o básico:
A variável global
__name__
, no módulo que é o ponto de entrada para o seu programa, é'__main__'
. Caso contrário, é o nome pelo qual você importa o módulo.Portanto, o código sob o
if
bloco será executado apenas se o módulo for o ponto de entrada para o seu programa.Ele permite que o código no módulo seja importável por outros módulos, sem executar o bloco de código abaixo na importação.
Por que nós precisamos disso?
Desenvolvendo e testando seu código
Digamos que você esteja escrevendo um script Python projetado para ser usado como um módulo:
Você pode testar o módulo adicionando esta chamada da função na parte inferior:
e executá-lo (em um prompt de comando) com algo como:
O problema
No entanto, se você deseja importar o módulo para outro script:
Na importação, a
do_important
função seria chamada, então você provavelmente comentaria sua chamada de função,,do_important()
na parte inferior.E então você terá que lembrar se comentou ou não sua chamada de função de teste. E essa complexidade extra significa que você provavelmente esquecerá, tornando seu processo de desenvolvimento mais problemático.
Uma maneira melhor
A
__name__
variável aponta para o espaço para nome onde quer que o intérprete Python esteja no momento.Dentro de um módulo importado, é o nome desse módulo.
Mas dentro do módulo primário (ou uma sessão interativa do Python, ou seja, Read, Eval, Print Loop ou REPL do intérprete), você está executando tudo
"__main__"
.Portanto, se você verificar antes de executar:
Com o exposto acima, seu código só será executado quando você o estiver executando como módulo primário (ou intencionalmente o chamará de outro script).
Uma maneira ainda melhor
Há uma maneira pitônica de melhorar isso, no entanto.
E se quisermos executar esse processo de negócios de fora do módulo?
Se colocarmos o código que queremos exercitar à medida que desenvolvemos e testamos em uma função como essa e fazemos nossa verificação
'__main__'
imediatamente após:Agora, temos uma função final para o final do nosso módulo que será executada se executarmos o módulo como o módulo principal.
Ele permitirá que o módulo e suas funções e classes sejam importados para outros scripts sem executar a
main
função, e também permitirá que o módulo (e suas funções e classes) sejam chamados ao executar a partir de um'__main__'
módulo diferente , ou seja,Esse idioma também pode ser encontrado na documentação do Python em uma explicação do
__main__
módulo. Esse texto declara:fonte
if __name__ == "__main__"
é a parte que é executado quando o script é executado a partir de (digamos) na linha de comando usando um comando comopython myscript.py
.fonte
helloworld.py
com apenasprint("hello world")
nele pode ser executado com o comandopython helloworld.py
mesmo quando não existeif __name__ == "__main__"
?__name__
é uma variável global (em Python, global significa realmente no nível do módulo ) que existe em todos os namespaces. Normalmente, é o nome do módulo (como umstr
tipo).Como o único caso especial, no entanto, em qualquer processo Python que você execute, como em mycode.py:
o namespace global outra forma anônima é atribuído o valor
'__main__'
da sua__name__
.Assim, incluindo as linhas finais
fará com que a
main
função definida exclusivamente do seu script seja executada.Outro benefício do uso dessa construção: você também pode importar seu código como um módulo em outro script e, em seguida, executar a função principal se e quando seu programa decidir:
fonte
Existem várias abordagens diferentes aqui sobre a mecânica do código em questão, o "Como", mas para mim nada disso fazia sentido até eu entender o "Por que". Isso deve ser especialmente útil para novos programadores.
Tome o arquivo "ab.py":
E um segundo arquivo "xy.py":
Quando você executa
xy.py
, vocêimport ab
. A instrução de importação executa o módulo imediatamente na importação, para queab
as operações sejam executadas antes do restante dasxy
. Uma vez terminadoab
, continua comxy
.O intérprete controla quais scripts estão sendo executados
__name__
. Quando você executa um script - não importa como você o nomeou - o intérprete o chama"__main__"
, tornando-o o script mestre ou 'home' que é retornado após a execução de um script externo.Qualquer outro script chamado deste
"__main__"
script recebe seu nome de arquivo como__name__
(por exemplo,__name__ == "ab.py"
). Portanto, a linhaif __name__ == "__main__":
é o teste do intérprete para determinar se está interpretando / analisando o script 'home' que foi executado inicialmente ou se está temporariamente espiando outro script (externo). Isso dá ao programador flexibilidade para que o script se comporte de maneira diferente se for executado diretamente e chamado externamente.Vamos percorrer o código acima para entender o que está acontecendo, focando primeiro nas linhas não recortadas e na ordem em que elas aparecem nos scripts. Lembre-se de que funções ou
def
blocos não fazem nada sozinhos até serem chamados. O que o intérprete pode dizer se resmungar consigo mesmo:"__main__"
na__name__
variável__name__ == "ab.py"
.a()
; Eu acabei de aprender isso. Imprimindo ' Uma função em um arquivo ab '."__main__"
!x()
; ok, imprimir ' tarefa periférica: pode ser útil em outros projetos '.if
declaração. Bem, a condição foi atendida (a variável__name__
foi definida como"__main__"
), então eu vou inserir amain()
função e imprimir ' função principal: é aqui que está a ação '.As duas linhas inferiores significam: "Se este for o
"__main__"
script ou 'home', execute a função chamadamain()
". É por isso que você verá umdef main():
bloco no topo, que contém o fluxo principal da funcionalidade do script.Lembra do que eu disse anteriormente sobre instruções de importação? Quando você importa um módulo, ele não apenas o 'reconhece' e aguarda mais instruções - ele realmente executa todas as operações executáveis contidas no script. Portanto, colocar a carne do seu script na
main()
função efetivamente o coloca em quarentena, colocando-o em isolamento para que não seja executado imediatamente quando importado por outro script.Novamente, haverá exceções, mas a prática comum é que
main()
geralmente não é chamado externamente. Então você deve estar se perguntando mais uma coisa: se não estamos ligandomain()
, por que estamos chamando o script? Isso ocorre porque muitas pessoas estruturam seus scripts com funções independentes criadas para serem executadas independentemente do restante do código no arquivo. Mais tarde, eles são chamados em outro lugar no corpo do script. O que me leva a isso:Sim está certo. Essas funções separadas podem ser chamadas de um script em linha que não está contido em uma
main()
função. Se você está acostumado (como eu, nos estágios iniciais de aprendizado da programação) a criar scripts em linha que fazem exatamente o que você precisa, e tentará descobrir novamente se precisar dessa operação novamente. bem, você não está acostumado a esse tipo de estrutura interna no seu código, porque é mais complicado criar e não é tão intuitivo quanto a leitura.Mas esse é um script que provavelmente não pode ter suas funções chamadas externamente, porque, se o fizesse, começaria imediatamente a calcular e atribuir variáveis. E é provável que, se você estiver tentando reutilizar uma função, seu novo script esteja relacionado o suficiente ao antigo para que haja variáveis conflitantes.
Ao dividir funções independentes, você ganha a capacidade de reutilizar seu trabalho anterior, chamando-o para outro script. Por exemplo, "example.py" pode importar "xy.py" e chamar
x()
, usando a função 'x' de "xy.py". (Talvez esteja capitalizando a terceira palavra de uma determinada sequência de texto; criando uma matriz NumPy a partir de uma lista de números e quadriculando-os; ou prejudicando uma superfície 3D. As possibilidades são ilimitadas.)(Como um aparte, esta questão contém uma resposta por @kindall que finalmente me ajudou a entender -. O porquê, não o quão Infelizmente tem sido marcada como uma duplicata de um presente , que eu acho que é um erro.)
fonte
Quando há certas instruções em nosso módulo (
M.py
) que queremos que sejam executadas quando estiverem sendo executadas como principais (não importadas), podemos colocar essas instruções (casos de teste, instruções de impressão) nesseif
bloco.Como padrão (quando o módulo é executado como principal, não importado), a
__name__
variável é definida como"__main__"
e, quando importada, a__name__
variável terá um valor diferente, provavelmente o nome do módulo ('M'
). Isso é útil para executar diferentes variantes de um módulo juntos, separar suas instruções específicas de entrada e saída e também se houver algum caso de teste.Em resumo , use este
if __name__ == "main"
bloco ' ' para impedir que (certo) código seja executado quando o módulo for importado.fonte
Simplificando,
__name__
é uma variável definida para cada script que define se o script está sendo executado como o módulo principal ou se está sendo executado como um módulo importado.Então, se tivermos dois scripts;
e
A saída da execução do script1 é
E a saída da execução do script2 é:
Como você pode ver,
__name__
nos diz qual código é o módulo 'principal'. Isso é ótimo, porque você pode escrever código e não precisa se preocupar com problemas estruturais, como no C / C ++, onde, se um arquivo não implementa uma função 'principal', ele não pode ser compilado como executável e, não pode então ser usado como uma biblioteca.Digamos que você escreva um script Python que faça algo excelente e implemente um monte de funções úteis para outros fins. Se eu quiser usá-los, basta importar o seu script e usá-los sem executar o seu programa (considerando que seu código é executado apenas dentro do
if __name__ == "__main__":
contexto). Enquanto em C / C ++ você teria que dividir essas partes em um módulo separado que inclui o arquivo. Imagine a situação abaixo;As setas são links de importação. Para três módulos, cada um tentando incluir o código dos módulos anteriores, existem seis arquivos (nove, contando os arquivos de implementação) e cinco links. Isso dificulta a inclusão de outro código em um projeto C, a menos que seja compilado especificamente como uma biblioteca. Agora imagine isso para Python:
Você escreve um módulo e, se alguém quiser usar seu código, basta importá-lo e a
__name__
variável pode ajudar a separar a parte executável do programa da parte da biblioteca.fonte
Vejamos a resposta de uma maneira mais abstrata:
Suponha que tenhamos esse código em
x.py
:Os blocos A e B são executados quando estamos executando
x.py
.Mas apenas o bloco A (e não B) é executado quando estamos executando outro módulo,
y.py
por exemplo, no qualx.py
é importado e o código é executado a partir daí (como quando uma função inx.py
é chamada fromy.py
).fonte
Quando você executa o Python interativamente, a
__name__
variável local recebe um valor de__main__
. Da mesma forma, quando você executa um módulo Python a partir da linha de comando, em vez de importá-lo para outro módulo, seu__name__
atributo recebe um valor de__main__
, em vez do nome real do módulo. Dessa forma, os módulos podem analisar seu próprio__name__
valor para determinar por si mesmos como estão sendo usados, seja como suporte para outro programa ou como o aplicativo principal executado na linha de comando. Portanto, o seguinte idioma é bastante comum nos módulos Python:fonte
Considerar:
Ele verifica se o
__name__
atributo do script Python é"__main__"
. Em outras palavras, se o próprio programa for executado, o atributo será__main__
, então o programa será executado (neste caso, amain()
função).No entanto, se o script Python for usado por um módulo, qualquer código fora da
if
instrução será executado, portanto,if \__name__ == "\__main__"
é usado apenas para verificar se o programa é usado como módulo ou não e, portanto, decide se o código deve ser executado.fonte
Antes de explicar qualquer coisa
if __name__ == '__main__'
, é importante entender o que__name__
é e o que faz.__name__
é um DunderAlias - pode ser pensado como uma variável global (acessível a partir de módulos) e funciona de maneira semelhante aglobal
.É uma string (global como mencionado acima), conforme indicado por
type(__name__)
(yield<class 'str'>
), e é um padrão embutido para as versões Python 3 e Python 2 .Ele não pode ser usado apenas em scripts, mas também pode ser encontrado no interpretador e nos módulos / pacotes.
Intérprete:
Roteiro:
test_file.py :
Resultando em
__main__
Módulo ou pacote:
somefile.py:
test_file.py:
Resultando em
somefile
Observe que, quando usado em um pacote ou módulo,
__name__
leva o nome do arquivo. O caminho do módulo ou pacote real não é fornecido, mas possui seu próprio DunderAlias__file__
, que permite isso.Você deve ver que, onde
__name__
, onde está o arquivo principal (ou programa) sempre retornará__main__
e, se for um módulo / pacote, ou qualquer coisa que esteja executando algum outro script Python, retornará o nome do arquivo onde está se originou de.Ser uma variável significa que seu valor pode ser substituído ("can" não significa "deveria"), substituindo o valor de
__name__
resultará em falta de legibilidade. Portanto, não faça isso, por qualquer motivo. Se você precisar de uma variável, defina uma nova variável.Sempre se assume que o valor de
__name__
to be__main__
ou o nome do arquivo. Mais uma vez, alterar esse valor padrão causará mais confusão de que será bom, causando problemas mais adiante.exemplo:
É considerado uma boa prática em geral incluir os
if __name__ == '__main__'
scripts.Agora sabemos que o comportamento das
__name__
coisas se torna mais claro:An
if
é uma instrução de controle de fluxo que contém o bloco de código que será executado se o valor fornecido for verdadeiro. Vimos isso__name__
pode levar__main__
ou o nome do arquivo do qual foi importado.Isso significa que se
__name__
é igual a__main__
, o arquivo deve ser o arquivo principal e realmente estar em execução (ou é o intérprete), não um módulo ou pacote importado para o script.Se de fato
__name__
leva o valor de__main__
, o que estiver nesse bloco de código será executado.Isso nos diz que, se o arquivo em execução é o arquivo principal (ou você está executando diretamente do intérprete), essa condição deve ser executada. Se for um pacote, não deve, e o valor não será
__main__
.__name__
também pode ser usado em módulos para definir o nome de um móduloTambém é possível fazer outras coisas menos comuns, mas úteis
__name__
, algumas que mostrarei aqui:Executando apenas se o arquivo for um módulo ou pacote:
Executando uma condição se o arquivo for o principal e outro se não for:
Você também pode usá-lo para fornecer funções / utilitários de ajuda executáveis em pacotes e módulos sem o uso elaborado de bibliotecas.
Ele também permite que os módulos sejam executados a partir da linha de comando como scripts principais, o que também pode ser muito útil.
fonte
Eu acho que é melhor quebrar a resposta em profundidade e em palavras simples:
__name__
: Todo módulo no Python possui um atributo especial chamado__name__
. É uma variável interna que retorna o nome do módulo.__main__
: Como outras linguagens de programação, o Python também possui um ponto de entrada de execução, ou seja, principal.'__main__'
é o nome do escopo no qual o código de nível superior é executado . Basicamente, você tem duas maneiras de usar um módulo Python: Execute-o diretamente como um script ou importe-o. Quando um módulo é executado como um script,__name__
é definido como__main__
.Portanto, o valor do
__name__
atributo é definido como__main__
quando o módulo é executado como o programa principal. Caso contrário, o valor de__name__
é definido para conter o nome do módulo.fonte
É um especial para quando um arquivo Python é chamado na linha de comando. Isso geralmente é usado para chamar uma função "main ()" ou executar outro código de inicialização apropriado, como manipulação de argumentos de linha de comando, por exemplo.
Pode ser escrito de várias maneiras. Outro é:
Não estou dizendo que você deva usar isso no código de produção, mas serve para ilustrar que não há nada de "mágico"
if __name__ == '__main__'
. É uma boa convenção para invocar uma função principal nos arquivos Python.fonte
and
.and
é usado para verificar se duas instruções booleanas são verdadeiras. Como você não está interessado no resultado daand
, umaif
declaração comunica mais claramente suas intenções.Há várias variáveis que o sistema (intérprete Python) fornece para arquivos de origem (módulos). Você pode obter os valores quando quiser, portanto, vamos nos concentrar na variável / atributo __name__ :
Quando o Python carrega um arquivo de código-fonte, ele executa todo o código encontrado nele. (Observe que ele não chama todos os métodos e funções definidos no arquivo, mas define-os.)
Antes que o intérprete execute o arquivo de código-fonte, ele define algumas variáveis especiais para esse arquivo; __name__ é uma daquelas variáveis especiais que o Python define automaticamente para cada arquivo de código-fonte.
Se o Python estiver carregando esse arquivo de código-fonte como o programa principal (ou seja, o arquivo que você executa), ele definirá a variável __name__ especial para que esse arquivo tenha o valor "__main__" .
Se isso estiver sendo importado de outro módulo, __name__ será definido como o nome desse módulo.
Então, no seu exemplo, em parte:
significa que o bloco de código:
será executado somente quando você executar o módulo diretamente; o bloco de código não será executado se outro módulo estiver chamando / importando porque o valor de __name__ não será igual a " main " nessa instância específica.
Espero que isso ajude.
fonte
if __name__ == "__main__":
é basicamente o ambiente de script de nível superior e especifica o intérprete que ('Eu tenho a maior prioridade para ser executado primeiro').'__main__'
é o nome do escopo no qual o código de nível superior é executado. Um módulo__name__
é definido igual a'__main__'
quando lido da entrada padrão, de um script ou de um prompt interativo.fonte
Eu tenho lido muito nas respostas desta página. Eu diria que, se você souber, certamente entenderá essas respostas; caso contrário, ainda estará confuso.
Para ser breve, você precisa conhecer vários pontos:
import a
ação realmente executa tudo o que pode ser executado em "a"Por causa do ponto 1, você pode não querer que tudo seja executado em "a" ao importá-lo
Para resolver o problema no ponto 2, python permite que você faça uma verificação de condição
__name__
é uma variável implícita em todos os.py
módulos; Quandoa.py
é importado, o valor de__name__
doa.py
módulo é definido como seu nome de arquivo "a
"; quandoa.py
é executado diretamente usando "python a.py
", o que significa quea.py
é o ponto de entrada, o valor__name__
doa.py
módulo é definido como uma sequência__main__
Com base no mecanismo de como o python define a variável
__name__
para cada módulo, você sabe como alcançar o ponto 3? A resposta é bastante fácil, certo? Coloque um se condição:if __name__ == "__main__": ...
; você pode até colocar se,__name__ == "a"
dependendo da sua necessidade funcionalO importante no qual o python é especial é o ponto 4! O resto é apenas lógica básica.
fonte
Considerar:
A saída para o acima é
__main__
.A declaração acima é verdadeira e imprime "método direto" . Suponha que se eles importaram essa classe em outra classe, ela não imprime "método direto" porque, durante a importação, ela será configurada
__name__ equal to "first model name"
.fonte
fibo.py (um módulo chamado
fibo
)Referência: https://docs.python.org/3.5/tutorial/modules.html
fonte
A razão para
é principalmente para evitar os problemas de bloqueio de importação que surgiriam da importação direta de código . Você deseja
main()
executar se o seu arquivo foi chamado diretamente (esse é o__name__ == "__main__"
caso), mas se o seu código foi importado, o importador deve inserir o código no módulo principal verdadeiro para evitar problemas de bloqueio de importação.Um efeito colateral é que você assina automaticamente em uma metodologia que suporta vários pontos de entrada. Você pode executar seu programa usando
main()
como ponto de entrada, mas não precisa . Enquantosetup.py
esperamain()
, outras ferramentas usam pontos de entrada alternativos. Por exemplo, para executar seu arquivo como umgunicorn
processo, você define umaapp()
função em vez de amain()
. Assim comosetup.py
,gunicorn
importa o código para que você não queira fazer nada enquanto estiver sendo importado (devido ao problema do bloqueio de importação).fonte
Esta resposta é para programadores Java aprendendo Python. Todo arquivo Java normalmente contém uma classe pública. Você pode usar essa classe de duas maneiras:
Chame a turma de outros arquivos. Você apenas precisa importá-lo no programa de chamada.
Execute a classe independente, para fins de teste.
Para o último caso, a classe deve conter um método público static void main (). No Python, esse objetivo é atendido pelo rótulo definido globalmente
'__main__'
.fonte
O código abaixo
if __name__ == '__main__':
somente será executado se o módulo for chamado como um script .Como exemplo, considere o seguinte módulo
my_test_module.py
:1ª possibilidade: importar
my_test_module.py
em outro móduloAgora, se você chamar
main.py
:Observe que apenas a
print()
instrução de nível superiormy_test_module
é executada.Segunda possibilidade: invocar
my_test_module.py
como scriptAgora, se você executar
my_test_module.py
como um script Python, as duasprint()
instruções serão executadas:fonte
Cada módulo em python tem um atributo chamado
__name__
. O valor do__name__
atributo é__main__
quando o módulo é executado diretamente, comopython my_module.py
. Caso contrário (como quando você dizimport my_module
), o valor de__name__
é o nome do módulo.Pequeno exemplo para explicar em resumo.
Podemos executar isso diretamente como
Resultado
Agora, suponha que chamamos o script acima de outro script
Quando você executa isso
Resultado
Portanto, acima é auto-explicativo que quando você chama test de outro script, se o loop
__name__
intest.py
não for executado.fonte
Se esse arquivo .py for importado por outros arquivos .py, o código em "a instrução if" não será executado.
Se esse arquivo .py for executado
python this_py.py
no shell, clique duas vezes no Windows. o código em "a instrução if" será executado.Geralmente é escrito para teste.
fonte
Se o intérprete python estiver executando um módulo específico,
__name__
a variável global terá valor"__main__"
Quando você executa esse script, pode me ver
uma
Se você importar esse arquivo, diga A para o arquivo B e execute o arquivo B,
if __name__ == "__main__"
em seguida , o arquivo A se tornará falso, para que seja impresso Você não pode me verb
fonte
Todas as respostas explicaram bastante a funcionalidade. Mas vou fornecer um exemplo de seu uso que pode ajudar a esclarecer ainda mais o conceito.
Suponha que você tenha dois arquivos Python, a.py e b.py. Agora, o a.py importa o b.py. Executamos o arquivo a.py, onde o código "import b.py" é executado primeiro. Antes da execução do restante do código a.py, o código no arquivo b.py deve ser executado completamente.
No código b.py, há algum código exclusivo para esse arquivo b.py e não queremos outro arquivo (que não seja o arquivo b.py) que tenha importado o arquivo b.py para executá-lo.
Então é isso que essa linha de código verifica. Se for o arquivo principal (ou seja, b.py) executando o código, que neste caso não é (a.py é o arquivo principal em execução), somente o código será executado.
fonte
Crie um arquivo, a.py :
__name__
é sempre igual__main__
sempre que esse arquivo é executado diretamente mostrando que esse é o arquivo principal.Crie outro arquivo, b.py , no mesmo diretório:
Executá-lo. Irá imprimir um , ou seja, o nome do arquivo que é importado .
Portanto, para mostrar dois comportamentos diferentes do mesmo arquivo , este é um truque comumente usado:
fonte
se nome == ' principal ':
Vemos se com
__name__ == '__main__':
bastante frequência.Ele verifica se um módulo está sendo importado ou não.
Em outras palavras, o código dentro do
if
bloco será executado apenas quando o código for executado diretamente. Aquidirectly
significanot imported
.Vamos ver o que ele faz usando um código simples que imprime o nome do módulo:
Se executarmos o código diretamente via
python test.py
, o nome do módulo será__main__
:fonte
Simplesmente, é o ponto de entrada para executar o arquivo, como a
main
função na linguagem de programação C.fonte
if __name__ == "__main__"
bloco. Tecnicamente, a parte superior do script executado é o ponto de entrada do programa.