2010-11-20 67 views
14

mi problema es que quiero ejecutar un archivo python con un argumento dentro de otro archivo python para obtener los valores devueltos ...cómo ejecutar un archivo de script python con un argumento desde otro archivo de script python

no sé si me he explicado bien ...

ejemplo:

de la cáscara ejecuto esto:

  getCameras.py "path_to_the_scene" 

y esto me devolverá una lista de cámaras .. ..

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

He estado tratando de averiguar por mí mismo mediante la lectura de algunas otras preguntas aquí, pero yo no lo entendía así, debería utilizar la función execfile() ?? ¿¿cómo exactamente??

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

Ok, después de ver sus respuestas, tengo que editar mi pregunta para hacerlo más conciso 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 marcas que puede ejecutar directamente desde el shell del sistema agregando un argumento (o indicadores, en el caso "doRender.py") y, si es posible , Quiero seguir teniendo esta posibilidad para poder elegir entre ejecutar la interfaz de usuario o ejecutar el script directamente desde el shell

Ya he hecho algunas modificaciones para que funcionen importándolos desde el script "renderUI.py" pero ahora que no funcionan por sí mismos ....

Así es posible tener esta guiones de trabajo por sí mismos y todavía tienen la posibilidad de llamarlos de otro guión? ¿cómo exactamente? Esto "separando la lógica del manejo de argumento de línea de comando" que me dijiste antes me suena bien pero no sé cómo implementarlo en mi script (lo intenté pero sin éxito) ....

Es por eso que estoy publicando aquí el código original para que vea cómo lo hice, siéntase libre de hacer críticas y/o corregir el código para explicarme cómo debería hacerlo para que el script funcione correctamente ...

#!/usr/bin/env python 

import re,sys 

if len(sys.argv) != 2: 
    print 'usage : getMayaCameras.py <path_to_originFile> \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

Respuesta

39

La mejor respuesta es No. Escribe tus getCámaras.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])) 

desde su otro script, puede luego hacer

import getCamera 

getCamera.main(arg1, arg2) 

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

+1

No lo entiendo muy bien, ¿de esta manera sigues siendo capaz de invocar el guión con argumentos del intérprete de comandos? ... de todos modos traté de implementarlo en mi secuencia de comandos sin éxito, por favor, ¿puedes hacerlo? con el guión que dejé aquí, entonces ¿puedo usarlo como ejemplo? – user497457

+0

no funciona ... – user1701047

0

execfile() ejecuta una secuencia de comandos dentro de la otra, que no es lo que desea. El módulo subprocess se puede utilizar 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.

9

En primer lugar, estoy de acuerdo con otros que habrá que editar su código para separar la lógica del manejo de argumentos de la línea de comando.

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

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

gracias por la respuesta, pero no puedo hacer que funcione, al menos si hago algo como cameras = os.system ('getCameras.py' path_to_the_scene '') ..... no obtiene los valores devueltos – user497457

0

le sugiero que reorganizado sus getCameras.py, envuelva el código de lista de cámaras ponerse en un método llamado get_cameras(). Luego puede 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() 
2

Otra forma en que puede ser preferible al uso de os.system() sería utilizar el módulo subprocess que fue inventado para reemplazar os.system() junto con un par de otros módulos un poco más antiguos. Con el siguiente programa es el que usted desea llamar con algún programa de máster:

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) 

Usando el programa anterior con subproccess de un programa principal que 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 de el día en que se imprimirá "THIS STRING WILL PRINT", que es el que pasaste a lo que llamé el programa maestro. subprocess tiene muchas opciones pero vale la pena usarlas porque si las usa, escriba que sus programas serán independientes del sistema. Consulte la documentación para subprocess y argparse.

Cuestiones relacionadas