Eu tenho um script chamado test1.py que não está em um módulo. Apenas possui código que deve ser executado quando o próprio script for executado. Não há funções, classes, métodos, etc. Eu tenho outro script que é executado como um serviço. Quero chamar test1.py a partir do script em execução como um serviço.
Por exemplo:
Arquivo test1.py
print "I am a test"
print "see! I do nothing productive."
Arquivo service.py
# Lots of stuff here
test1.py # do whatever is in test1.py
Estou ciente de um método que está abrindo o arquivo, lendo o conteúdo e basicamente avaliando-o. Estou assumindo que há uma maneira melhor de fazer isso. Ou pelo menos espero que sim.
runpy.run_module
resposta ainda ?!Respostas:
A maneira usual de fazer isso é algo como o seguinte.
test1.py
service.py
fonte
test1.py
estiver localizado em algum diretório distante?import test1
inservice.py
realmente executa o script inteiro (que apenas definesome_func()
uma vez que__name__ == '__main__'
seráFalse
nesse caso). Parece que todo o OP quer fazer. Essa resposta vai além disso, mas definitivamente responde à pergunta - e mais algumas.test1.py
não contivesse a definição da funçãosome_func()
(mas apenas algumas linhas de código, por exemploprint("hello")
), seu código não funcionaria. Neste exemplo em particular, ele funciona porque você está importando essencialmente uma função externa que depois será chamada de volta.Isso é possível no Python 2 usando
Consulte a documentação para lidar com espaços para nome, se importante no seu caso.
No Python 3, isso é possível usando (graças a @fantastory)
No entanto, você deve considerar o uso de uma abordagem diferente; sua ideia (pelo que posso ver) não parece muito limpa.
fonte
sys.argv
lista.Outra maneira:
Arquivo test1.py:
Arquivo service.py:
A vantagem desse método é que você não precisa editar um script Python existente para colocar todo o seu código em uma sub-rotina.
Documentação: Python 2 , Python 3
fonte
subprocess.call("./test1.py", shell=True)
para fazer o trabalhoshell=True
menos que seja necessário.test1.py
deve ser executável e ter a linha shebang (#!/usr/bin/env python
) e você deve especificar o caminho completo ou precisar fornecer o executável:call([sys.executable, os.path.join(get_script_dir(), 'test1.py')])
ondeget_script_dir()
é definido aqui .subprocess.call(['python', 'test1.py'])
.Se você deseja que o test1.py permaneça executável com a mesma funcionalidade de quando é chamado dentro de service.py, faça algo como:
test1.py
service.py
fonte
Usando o, você pode fazer chamadas diretamente para o seu terminal. Se você quiser ser ainda mais específico, pode concatenar sua string de entrada com variáveis locais, ie.
fonte
os.system
devem ser evitadas, você pode fazer o mesmo com qualquer classe dePopen, Call,
Você não deveria estar fazendo isso. Em vez disso, faça:
test1.py:
service.py
fonte
Use
import test1
para o 1º uso - ele executará o script. Para chamadas posteriores, trate o script como um módulo importado e chame oreload(test1)
métodoUma simples verificação de
sys.modules
pode ser usada para chamar a ação apropriada. Para continuar se referindo ao nome do script como uma string ('test1'
), use o ' import ()' interno.fonte
reload
se foi em Python 3.if __name__ == "__main__":
proteção. Pode haver outras diferenças mais sutis. Não deixe código arbitrário em nível global. Coloque-o em uma função e chamá-lo após a importação como sugerido na resposta aceita vezEu prefiro runpy :
fonte
Por que não apenas importar test1? Todo script python é um módulo. Uma maneira melhor seria ter uma função, por exemplo, main / run em test1.py, importar test1 e executar test1.main (). Ou você pode executar test1.py como um subprocesso.
fonte
Como já foi mencionado,
runpy
é uma boa maneira de executar outros scripts ou módulos a partir do script atual.A propósito, é bastante comum que um rastreador ou depurador faça isso e, em tais circunstâncias, métodos como importar o arquivo diretamente ou executá-lo em um subprocesso geralmente não funcionam.
Ele também precisa de atenção
exec
para executar o código. Você deve fornecer o adequadorun_globals
para evitar erros de importação ou outros problemas. Consulterunpy._run_code
para detalhes.fonte
Este é um exemplo com a
subprocess
biblioteca:fonte
Popen
, a menos que as funções de nível superior realmente não possam fazer o que deseja. Nesse caso,check_call
ourun
faria tudo o que você precisa e muito mais, com substancialmente menos encanamento em seu próprio código.Esse processo é um pouco ortodoxo, mas funcionaria em todas as versões python,
Suponha que você queira executar um script chamado 'recommend.py' dentro de uma condição 'if' e, em seguida, use,
A técnica é diferente, mas funciona!
fonte