2010-11-20 45 views
14

il mio problema è che voglio eseguire un file python con un argomento da dentro un altro file python per ottenere i valori restituiti ....come eseguire un file di script python con un argomento da all'interno di un altro file di script python

non so se ho spiegato bene ...

esempio:

dal guscio eseguo questo:

  getCameras.py "path_to_the_scene" 

e questo mi restituiscono un elenco di telecamere .. ..

così come posso chiamare questo script (compreso l'argomento) da un altro script ???

Ho cercato di capire da solo leggendo alcune altre domande qui, ma non ho capito bene, dovrei usare la funzione execfile() ?? come esattamente ??

Grazie in anticipo per aiutare un principiante come me !!

Ok, dopo dare un'occhiata alle tue risposte, devo modificare la mia domanda per renderla più concisa e perché non capisco alcune risposte (scusa, come ho detto che sono un novizio !!!):

Bene, ho questo 2 script "getMayaCameras.py" e "doRender.py" e uno più chiamato "renderUI.py" che implementa i primi 2 script in una GUI.

"getMayaCameras.py" e "doRender.py" sono entrambi scips che è possibile eseguire direttamente dalla shell di sistema aggiungendo un argomento (o flag, nel caso "doRender.py") e, Se è possibile , Voglio ancora avere questa possibilità così posso scegliere tra eseguire l'interfaccia utente o eseguire lo script direttamente dalla shell

Ho già apportato alcune modifiche per farli funzionare importandoli dallo script "renderUI.py" ma ora non lavorano da soli ....

Quindi è possibile avere questi script che lavorano da soli e che hanno ancora la possibilità di chiamarli da un altro script? esattamente? Questo "separando la logica dall'argomento della riga di comando che gestisce" che mi hai detto prima mi suona bene ma non so come implementarlo sul mio script (ho provato ma senza successo) ....

Ecco perché sto postando qui il codice originale per voi per vedere come l'ho realizzato, sentitevi liberi sia di fare critiche e/o correggere il codice per spiegarmi come dovrei farlo affinché lo script funzioni correttamente ...

ancora
#!/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() 

Grazie,

David

risposta

39

La risposta migliore è non. Scrivi le tue getCameras.py come

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])) 

dagli altri script, si può poi fare

import getCamera 

getCamera.main(arg1, arg2) 

o chiamare qualsiasi altra funzione in getCamera.py

+1

Io non lo capisco molto bene, in questo modo sei ancora in grado di chiamare lo script con args dalla shell? ... comunque ho provato a implementarlo nella mia sceneggiatura senza successo, per favore puoi farlo con la sceneggiatura che ho lasciato qui, quindi posso usarlo come esempio? – user497457

+0

non funziona ... – user1701047

0

execfile() esegue uno script nell'altro, che non è quello che si desidera. Il modulo subprocess può essere utilizzato per eseguire un'altra istanza dell'interprete Python, ma quello che dovresti fare è guardare getCameras.py e vedere se c'è qualche funzione che puoi richiamare dopo averla importata.

9

Prima di tutto, sono d'accordo con gli altri che si dovrebbe modificare la tua codice per separare la logica dalla gestione degli argomenti della riga di comando.

Ma nei casi in cui si utilizzano altre librerie e non si vuole rovinare la modifica, è comunque utile sapere come fare roba da riga di comando equivalente all'interno di Python.
La soluzione è os.system (comando)
Atleast su Windows, visualizza una console ed esegue il comando, proprio come se fosse stato immesso nel prompt dei comandi.

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

grazie per la risposta, ma non riesco a farlo funzionare, almeno se faccio qualcosa come cameras = os.system ('getCameras.py "path_to_the_scene"') ..... non ottiene i valori restituiti – user497457

0

vi consiglio di riorganizzato il tuo getCameras.py, avvolgere l'ottenere il codice lista macchina fotografica in un metodo chiamato get_cameras(). Quindi puoi chiamare questo metodo in altri script python.

getCameras.py

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

Modo d'uso: other.py

import getCameras 
camera_list = getCameras.get_cameras() 
2

Un altro modo che può essere preferibile utilizzare os.system() sarebbe quella di utilizzare il modulo subprocess che è stato inventato per sostituire os.system() insieme ad un paio di altri moduli leggermente più vecchi. Con il seguente programma che è quello che si desidera chiamare con un certo programma di master:

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) 

Utilizzando il programma di cui sopra con subproccess da un programma di master sarebbe sarebbe simile a questa:

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) 

Alla fine del il giorno in cui verrà stampato "THIS STRING WILL PRINT", che è quello che hai passato in quello che ho chiamato il programma principale. subprocess ha molte opzioni ma vale la pena utilizzarlo perché se lo usi scrivi i tuoi programmi saranno indipendenti dal sistema. Vedere la documentazione per subprocess e argparse.

Problemi correlati