python - programa - ¿Cuál es la mejor manera de llamar a un script desde otro script?
llamar una funcion de otro script python (8)
¿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, importar test1 y ejecutar test1.main (). O puede ejecutar test1.py como un subproceso.
Tengo un script llamado test1.py que no está en un módulo. Simplemente tiene un código que debería ejecutarse cuando se ejecuta el script. No hay funciones, clases, métodos, etc. Tengo otra secuencia de comandos 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
Soy consciente de un método que es abrir el archivo, leer los contenidos y básicamente evaluarlos. Estoy asumiendo que hay una mejor manera de hacer esto. O al menos eso espero.
Esto es posible en Python 2 usando
execfile("test2.py")
Consulte la documentation para el manejo de espacios de nombres, si es importante en su caso.
Sin embargo, debe considerar utilizar un enfoque diferente; Tu idea (por lo que puedo ver) no se ve muy limpia.
La forma habitual de hacer esto es algo como lo siguiente.
test1.py
def some_func():
print ''in test 1, unproductive''
if __name__ == ''__main__'':
# test1.py executed as script
# do something
some_func()
service.py
import test1
def service_func():
print ''service func''
if __name__ == ''__main__'':
# service.py executed as script
# do something
service_func()
test1.some_func()
No deberías estar haciendo esto. En su lugar, hacer:
test1.py:
def print_test():
print "I am a test"
print "see! I do nothing productive."
service.py
#near the top
from test1 import print_test
#lots of stuff here
print_test()
Si quieres que test1.py permanezca ejecutable con la misma funcionalidad que cuando se llama dentro de service.py, haz algo como:
test1.py
def main():
print "I am a test"
print "see! I do nothing productive."
if __name__ == "__main__":
main()
service.py
import test1
# lots of stuff here
test1.main() # do whatever is in test1.py
Use import test1
para el primer uso: ejecutará el script. Para invocaciones posteriores, trate el script como un módulo importado y llame al método reload(test1)
.
Cuando se ejecuta la
reload(module)
:
- El código de los módulos de Python se vuelve a compilar y el código a nivel de módulo se vuelve a ejecutar , definiendo un nuevo conjunto de objetos que están vinculados a nombres en el diccionario del módulo. La función init de los módulos de extensión no se llama
Se puede utilizar una comprobación simple de sys.modules
para invocar la acción apropiada. Para seguir refiriéndose al nombre del script como una cadena ( ''test1''
), use el ''import()'' .
import sys
if sys.modules.has_key[''test1'']:
reload(sys.modules[''test1''])
else:
__import__(''test1'')
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)