¿Cuál es la mejor manera de llamar a un script desde otro script?

6 minutos de lectura

¿Cual es la mejor manera de llamar a un script
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:

Expediente test1.py:

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

Expediente service.py:

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

Conozco un método que es abrir el archivo, leer el contenido y básicamente evaluarlo. Supongo que hay una mejor manera de hacer esto. O al menos eso espero.

  • 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

  • Nadie ha publicado un runpy.run_module respuesta todavía?!

    – Aran Fey

    7 de mayo de 2019 a las 7:16

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 desde el script que importa.

    – gentil

    22 de marzo de 2017 a las 10:36

  • @GennaroTedesco: Estás equivocado. los import test1 en service.py efectivamente ejecuta el entero guión (que sólo define some_func() ya que __name__ == '__main__' sera 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

¿Cual es la mejor manera de llamar a un script
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

1646972887 777 ¿Cual es la mejor manera de llamar a un script
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

  • 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')]) donde 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

  • @NitishKumarPal No; como ya se señaló en comentarios anteriores, debe evitar shell=True cuando pueda. No hay funcionalidad de shell aquí, así que subprocess.call(['python', 'test1.py']) es definitivamente mejor, aunque probablemente deberías usar check_call o run en su lugar (o no ejecutar Python como un subproceso de Python). Ver también stackoverflow.com/questions/3172470/…

    – triplete

    4 de septiembre de 2019 a las 7:46

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

1646972888 592 ¿Cual es la mejor manera de llamar a un script
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

1646972888 523 ¿Cual es la mejor manera de llamar a un script
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?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad