Tengo un script llamado test1.py que no está en un módulo. Simplemente tiene código que debe ejecutarse cuando se ejecuta el script en sí. No hay funciones, clases, métodos, etc. Tengo otro script que se ejecuta como un servicio. Quiero llamar a 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
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.
runpy.run_module
respuesta todavía?Respuestas:
La forma habitual de hacer esto es algo como lo siguiente.
test1.py
service.py
fuente
test1.py
se encuentra en un directorio lejano?import test1
inservice.py
ejecuta todo el script (que solo define,some_func()
ya__name__ == '__main__'
que 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.test1.py
no contiene la definición de la funciónsome_func()
(sino solo algunas líneas de código, por ejemploprint("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á volviendo a llamar.Esto es posible en Python 2 usando
Consulte la 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)
Sin embargo, debe considerar usar un enfoque diferente; Su idea (por lo que puedo ver) no se ve muy limpia.
fuente
sys.argv
lista.De otra manera:
Archivo test1.py:
Archivo service.py:
La ventaja de este método es que no tiene que editar un script Python existente para poner todo su código en una subrutina.
Documentación: Python 2 , Python 3
fuente
subprocess.call("./test1.py", shell=True)
para hacerlo funcionarshell=True
menos que sea necesario.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óndeget_script_dir()
se define aquí .subprocess.call(['python', 'test1.py'])
.Si desea que test1.py siga siendo ejecutable con la misma funcionalidad que cuando se llama dentro de service.py, haga algo como:
test1.py
service.py
fuente
Usando el sistema operativo puede hacer llamadas directamente a su terminal. Si desea ser aún más específico, puede concatenar su cadena de entrada con variables locales, es decir.
fuente
os.system
deben evitarse las llamadas a , puede hacer lo mismo con cualquier clase dePopen, Call,
No deberías estar haciendo esto. En cambio, haz:
test1.py:
service.py
fuente
Uso
import test1
para el primer uso: ejecutará el script. Para invocaciones posteriores, trate el script como un módulo importado y llame alreload(test1)
método.Se
sys.modules
puede usar una simple verificación de para invocar la acción apropiada. Para seguir refiriéndose al nombre del script como una cadena ('test1'
), use la función incorporada ' import ()' .fuente
reload
se ha ido en Python 3.if __name__ == "__main__":
guardar. Podría haber otras diferencias más sutiles. No deje código arbitrario a nivel global. Póngalo en una función yPrefiero runpy :
fuente
¿Por qué no solo importar test1? Cada script de Python es un módulo. Una mejor manera sería tener una función, por ejemplo, main / run en test1.py, import test1 y run test1.main (). O puede ejecutar test1.py como un subproceso.
fuente
Como ya se mencionó,
runpy
es una buena manera de ejecutar otros scripts o módulos desde el script actual.Por cierto, es bastante común que un rastreador o depurador haga esto, y en tales circunstancias, los métodos como importar el archivo directamente o ejecutar el archivo en un subproceso generalmente no funcionan.
También necesita atención para usar
exec
el código. Debe proporcionar la información adecuadarun_globals
para evitar errores de importación u otros problemas. Consulterunpy._run_code
para más detalles.fuente
Este es un ejemplo con la
subprocess
biblioteca:fuente
Popen
menos que las funciones de nivel superior realmente no puedan hacer lo que desea. En este caso,check_call
orun
haría todo lo que necesita y más, con sustancialmente menos plomería en su propio código.Este proceso no es ortodoxo, pero funcionaría en todas las versiones de Python,
Suponga que desea ejecutar un script llamado 'recomendar.py' dentro de una condición 'si', luego use,
La técnica es diferente, ¡pero funciona!
fuente