¿Cómo llamar a un script desde otro script?

5 minutos de lectura

Avatar de usuario de Josh Smeaton
Josh Smeton

tengo un script llamado test1.py que no está en un módulo. Solo tiene un código que debe ejecutarse cuando se ejecuta el script. No hay funciones, clases, métodos, etc. Tengo otro script que se ejecuta como servicio. quiero llamar test1.py desde el script que se ejecuta como un servicio.

Por ejemplo:

Archivo test1.py:

print "I am a test"
print "see! I do nothing productive."

Archivo service.py:

# Lots of stuff here
test1.py # do whatever is in test1.py

  • La mejor manera es escribir métodos y clases y usarlos.

    – Aamir

    27 de julio de 2009 a las 7:00

  • relacionado: Python 3: Llame a la secuencia de comandos de python con entrada en una secuencia de comandos de python usando un subproceso

    – jfs

    29 de noviembre de 2015 a las 8:40

  • Vea esta respuesta: stackoverflow.com/a/71967141/1364242

    – Jay M.

    22 de abril de 2022 a las 10:20

La forma habitual de hacer esto es algo como lo siguiente.

prueba1.py

def some_func():
    print 'in test 1, unproductive'

if __name__ == '__main__':
    # test1.py executed as script
    # do something
    some_func()

servicio.py

import test1

def service_func():
    print 'service func'

if __name__ == '__main__':
    # service.py executed as script
    # do something
    service_func()
    test1.some_func()

  • Y si test1.py se encuentra en algún directorio lejano?

    –Evgeni Sergeev

    8 de junio de 2014 a las 5:46

  • @EvgeniSergeev Ver stackoverflow.com/questions/67631/…

    –Evgeni Sergeev

    8 de junio de 2014 a las 6:27

  • Sin embargo, esto realmente no responde la pregunta, ¿verdad? No está ejecutando todo el script, está ejecutando algunas funciones dentro del script que importa.

    – gentil

    22 de marzo de 2017 a las 10:36

  • @GennaroTedesco: Estás equivocado. El import test1 en service.py efectivamente ejecuta el entero guión (que sólo define some_func() desde __name__ == '__main__' será False en ese caso). Eso suena como todo lo que el OP quiere hacer. Esta respuesta va más allá de eso, pero definitivamente responde la pregunta, y algo más.

    – martineau

    6 de noviembre de 2017 a las 17:15


  • Si, digamos, test1.py no contenía la definición de la función some_func() (sino solo algunas líneas de código, por ejemplo print("hello")) entonces su código no funcionaría. En este ejemplo en particular, funciona porque esencialmente está importando una función externa a la que luego está llamando.

    – gentil

    6 de noviembre de 2017 a las 20:29

avatar de usuario de balpha
alfa

Esto es posible en Python 2 usando

execfile("test2.py")

Ver el documentación para el manejo de espacios de nombres, si es importante en su caso.

En Python 3, esto es posible usando (gracias a @fantastory)

exec(open("test2.py").read())

Sin embargo, debería considerar usar un enfoque diferente; tu idea (por lo que puedo ver) no se ve muy limpia.

  • directamente lo que necesito en python 32 es exec(open(‘test2.py’).read())

    – Fantasía

    16 de marzo de 2012 a las 10:43


  • Este enfoque ejecuta los scripts dentro del espacio de nombres de llamada. 🙂

    – dmvianna

    21 de octubre de 2013 a las 5:46


  • para pasar argumentos de línea de comandos al script, puede editar sys.argv lista.

    – jfs

    13 de enero de 2015 a las 18:09

  • Tratamiento más completo de los equivalentes de Python 3: stackoverflow.com/questions/436198/…

    – Juan Y.

    4 de agosto de 2016 a las 15:38

  • ¡Esto no acepta argumentos (para ser pasados ​​al archivo PY)!

    – Apóstoles

    13 de septiembre de 2018 a las 10:43

Avatar de usuario de Dick Goodwin
dick goodwin

De otra manera:

Archivo prueba1.py:

print "test1.py"

Archivo service.py:

import subprocess

subprocess.call("test1.py", shell=True)

La ventaja de este método es que no tiene que editar un script de Python existente para poner todo su código en una subrutina.

Documentación: Pitón 2, Pitón 3

  • tuve que usar subprocess.call("./test1.py", shell=True) para que funcione

    – Asmaier

    17 de abril de 2013 a las 9:45

  • No utilice shell=True a menos que sea necesario.

    –Piotr Dobrogost

    3 de noviembre de 2013 a las 10:58

  • @PiotrDobrogost: ¿podría especificar qué situaciones lo harían necesario?

    – sancho.s ReincorporarMonicaCellio

    26 de diciembre de 2013 a las 13:12

  • No funcionará en un Unix típico donde el directorio actual no está en PATH. test1.py debe ser ejecutable y tener la línea shebang (#!/usr/bin/env python) y debe especificar la ruta completa o debe proporcionar el ejecutable usted mismo: call([sys.executable, os.path.join(get_script_dir(), 'test1.py')]) dónde get_script_dir() se define aquí.

    – jfs

    13 de enero de 2015 a las 18:14


  • O subprocess.call(['python', 'test1.py']).

    – Gran McLargeEnorme

    6 de marzo de 2018 a las 16:06

import os

os.system("python myOtherScript.py arg1 arg2 arg3")  

Usando os puedes hacer llamadas directamente a tu terminal. Si desea ser aún más específico, puede concatenar su cadena de entrada con variables locales, es decir.

command = 'python myOtherScript.py ' + sys.argv[1] + ' ' + sys.argv[2]
os.system(command)

Si desea que test1.py siga siendo ejecutable con la misma funcionalidad que cuando se llama dentro de service.py, haga algo como:

prueba1.py

def main():
    print "I am a test"
    print "see! I do nothing productive."

if __name__ == "__main__":
    main()

servicio.py

import test1
# lots of stuff here
test1.main() # do whatever is in test1.py

  • ¿Qué sucede si tiene parámetros de tiempo de ejecución?

    – Gabriel Feria

    17/06/2018 a las 20:00

  • sys.argv todavía se puede utilizar aquí. Y tu puedes def main(*args)según sea necesario

    – Un jugador de críquet

    17 de agosto de 2021 a las 18:46

Avatar de usuario de Flavio
flavio

yo prefiero escurridizo:

#!/usr/bin/env python
# coding: utf-8

import runpy

runpy.run_path(path_name="script-01.py")
runpy.run_path(path_name="script-02.py")
runpy.run_path(path_name="script-03.py")

  • ¿Qué sucede si tiene parámetros de tiempo de ejecución?

    – Gabriel Feria

    17/06/2018 a las 20:00

  • sys.argv todavía se puede utilizar aquí. Y tu puedes def main(*args)según sea necesario

    – Un jugador de críquet

    17 de agosto de 2021 a las 18:46

avatar de usuario de thedz
thedz

No deberías estar haciendo esto. En su lugar, haz:

prueba1.py:

 def print_test():
      print "I am a test"
      print "see! I do nothing productive."

servicio.py

#near the top
from test1 import print_test
#lots of stuff here
print_test()

  • cuando importa test1, ¿cómo sabe dónde está el archivo? tiene que estar en el mismo directorio? ¿y si no?

    – NULL.Amigo

    03/04/2018 a las 19:50

¿Ha sido útil esta solución?