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 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
enservice.py
efectivamente ejecuta el entero guión (que sólo definesome_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ó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á llamando.– gentil
6 de noviembre de 2017 a las 20:29
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
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.
-
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óndeget_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 puedesdef main(*args)
según sea necesario– Un jugador de críquet
17 de agosto de 2021 a las 18:46
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 puedesdef main(*args)
según sea necesario– Un jugador de críquet
17 de agosto de 2021 a las 18:46
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
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