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_modulerespuesta todavía?Respuestas:
La forma habitual de hacer esto es algo como lo siguiente.
test1.py
service.py
fuente
test1.pyse encuentra en un directorio lejano?import test1inservice.pyejecuta todo el script (que solo define,some_func()ya__name__ == '__main__'que seráFalseen 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.pyno 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.argvlista.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=Truemenos que sea necesario.test1.pydebe 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.systemdeben 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 test1para 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.modulespuede 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
reloadse 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ó,
runpyes 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
execel código. Debe proporcionar la información adecuadarun_globalspara evitar errores de importación u otros problemas. Consulterunpy._run_codepara más detalles.fuente
Este es un ejemplo con la
subprocessbiblioteca:fuente
Popenmenos que las funciones de nivel superior realmente no puedan hacer lo que desea. En este caso,check_callorunharí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