cómo ejecutar un archivo de script de python con un argumento desde dentro de otro archivo de script de python

mi problema es que quiero ejecutar un archivo de python con un argumento desde dentro de otro archivo de python para obtener los valores devueltos …

No sé si lo he explicado bien …

ejemplo:

desde la shell ejecuto esto:

getCameras.py "path_to_the_scene" 

Y esto me devuelve una lista de cámaras ….

Entonces, ¿cómo puedo llamar a este script (incluido el argumento) desde otro script?

He estado tratando de resolverlo por mi cuenta leyendo algunas otras preguntas aquí, pero no lo entendí bien, ¿debo usar la función execfile ()? ¿¿cómo exactamente??

¡Gracias de antemano por ayudar a un novato como yo!

Ok, después de echar un vistazo a tus respuestas, tengo que editar mi pregunta para que sea más concisa y porque no entiendo algunas respuestas (lo siento, como dije que soy un novato!):

Bueno, tengo estos 2 scripts “getMayaCameras.py” y “doRender.py” y uno más llamado “renderUI.py” que implementa los primeros 2 scripts en una GUI.

“getMayaCameras.py” y “doRender.py” son dos puntos que puede ejecutar directamente desde el shell del sistema agregando un argumento (o banderas, en el caso “doRender.py”) y, si es posible, deseo Todavía tengo esta posibilidad para que pueda elegir entre ejecutar la interfaz de usuario o ejecutar el script directamente desde el shell

Ya hice algunas modificaciones para que funcionen al importarlas desde el script “renderUI.py”, pero ahora no funcionan por sí mismas …

Entonces, ¿es posible que estos scripts funcionen solos y que aún tengan la posibilidad de llamarlos desde otro script? ¿cómo exactamente? Esta “separación de la lógica del manejo de argumentos de la línea de comandos” que me dijo antes me suena bien, pero no sé cómo implementarla en mi script (lo intenté pero sin éxito) …

Por eso publico aquí el código original para que veas cómo lo hice, siéntete libre de hacer críticas y / o corregir el código para explicarme cómo debo hacer que el script funcione correctamente …

 #!/usr/bin/env python import re,sys if len(sys.argv) != 2: print 'usage : getMayaCameras.py  \nYou must specify the path to the origin file as the first arg' sys.exit(1) def getMayaCameras(filename = sys.argv[1]): try: openedFile = open(filename, 'r') except Exception: print "This file doesn't exist or can't be read from" import sys sys.exit(1) cameras = [] for line in openedFile: cameraPattern = re.compile("createNode camera") cameraTest = cameraPattern.search(line) if cameraTest: cameraNamePattern = re.compile("-p[\s]+\"(.+)\"") cameraNameTest = cameraNamePattern.search(line) name = cameraNameTest.group(1) cameras.append(name) openedFile.close() return cameras getMayaCameras() 

Gracias de nuevo,

David

La mejor respuesta es no . Escribe tu getCameras.py como

 import stuff1 import stuff2 import sys def main(arg1, arg2): # do whatever and return 0 for success and an # integer x, 1 <= x <= 256 for failure if __name__=='__main__': sys.exit(main(sys.argv[1], sys.argv[2])) 

De su otro guión, puede hacer

 import getCamera getCamera.main(arg1, arg2) 

o llama a cualquier otra función en getCamera.py

En primer lugar, estoy de acuerdo con los demás en que debe editar su código para separar la lógica de la gestión de argumentos de la línea de comandos.

Pero en los casos en los que estás utilizando otras bibliotecas y no quieres perder el tiempo editándolas, sigue siendo útil saber cómo hacer cosas de línea de comandos equivalentes desde Python.
La solución es os.system (comando)
Al menos en Windows, abre una consola y ejecuta el comando, de la misma manera que si lo hubiera ingresado en el símbolo del sistema.

 import os os.system('getCameras.py "path_to_the_scene" ') 

Otra forma que puede ser preferible a usar os.system() sería usar el módulo de subprocess que se inventó para reemplazar os.system() junto con un par de otros módulos ligeramente más antiguos. Con el siguiente progtwig es el que desea llamar con algún progtwig maestro:

 import argparse # Initialize argument parse object parser = argparse.ArgumentParser() # This would be an argument you could pass in from command line parser.add_argument('-o', action='store', dest='o', type=str, required=True, default='hello world') # Parse the arguments inargs = parser.parse_args() arg_str = inargs.o # print the command line string you passed (default is "hello world") print(arg_str) 

El uso del progtwig anterior con subproccess desde un progtwig maestro se vería así:

 import subprocess # run your program and collect the string output cmd = "python your_program.py -o THIS STRING WILL PRINT" out_str = subprocess.check_output(cmd, shell=True) # See if it works. print(out_str) 

Al final del día, se imprimirá "THIS STRING WILL PRINT" , que es la que pasaste a lo que llamé el progtwig maestro. subprocess tiene muchas opciones, pero vale la pena usarlo porque si lo usa, sus progtwigs serán independientes del sistema. Consulte la documentación para subprocess , y argparse .

execfile() ejecuta un script dentro del otro, que no es lo que desea. El módulo de subprocess se puede usar para ejecutar otra instancia del intérprete de Python, pero lo que debe hacer es mirar getCameras.py y ver si hay alguna función que pueda invocar después de importarla.

Le sugiero que reorganice su getCameras.py, envuelva el código de la lista de cámaras en un método llamado get_cameras (). Luego puedes llamar a este método en otros scripts de python.

getCameras.py

 def get_cameras(): bulabula... if __name__ == '__main__': return get_cameras() 

Modo de empleo: other.py

 import getCameras camera_list = getCameras.get_cameras()