2015-06-05 23 views
6

Ho due file: script1.py e script2.py. Devo richiamare script2.py da script1.py e restituire il valore da script2.py a script1.py. Ma il problema è che script1.py esegue in realtà script2.py attraverso os.valore restituito da uno script python a un altro

script1.py:

import os 
print(os.system("script2.py 34")) 

script2.py

import sys 
def main(): 
    x="Hello World"+str(sys.argv[1]) 
    return x 

if __name__ == "__main__": 
    x= main() 

Come potete vedere, io sono in grado di ottenere il valore in SCRIPT2, ma non torna a script1. Come lo posso fare? NOTA: script2.py deve essere chiamato come se fosse un'esecuzione dalla riga di comando. Ecco perché sto usando os.

+0

Cosa deve essere restituito da 'script2.py'? Il codice di ritorno è sufficiente? –

+0

Voglio il valore x da restituire. In questo caso, script2 dovrebbe restituire "Hello World 34" – codingsplash

risposta

12

Ok, se ho capito bene che si desidera:

  • passare un argomento ad un altro script
  • recuperare un'uscita da un altro script per chiamante originale

mi consiglia di utilizzare modulo sottoprocesso. Il modo più semplice sarebbe utilizzare la funzione check_output(). soluzione

Run command with arguments and return its output as a byte string.

Esempio:

script1.py

import sys 
import subprocess 
s2_out = subprocess.check_output([sys.executable, "script2.py", "34"]) 
print s2_out 

script2.py:

import sys 
def main(arg): 
    print("Hello World"+arg) 

if __name__ == "__main__": 
    main(sys.argv[1]) 
+0

Grazie! Ma ottengo un TypeError: l'argomento di tipo 'int' non è un errore iterabile. È a causa della versione Python? Sto usando 3.4 – codingsplash

+0

@ user567 scusa, devi passare 34 come stringa. Modificherò una risposta. –

+0

@ Łukasz Rogalski, come posso convalidare s2_out se print (1) in script2.py? –

2

Il metodo consigliato per restituire un valore da un pitone "script" ad un altro è quello di importare lo script come un modulo Python e chiamare direttamente le funzioni:

import another_module 

value = another_module.get_value(34) 

dove another_module.py è:

#!/usr/bin/env python 
def get_value(*args): 
    return "Hello World " + ":".join(map(str, args)) 

def main(argv): 
    print(get_value(*argv[1:])) 

if __name__ == "__main__": 
    import sys 
    main(sys.argv) 

Si potrebbe sia importare another_module ed eseguirlo come uno script dalla riga di comando. Se non è necessario eseguirlo come script da riga di comando, è possibile rimuovere la funzione main() e il blocco if __name__ == "__main__".

Vedere anche, Call python script with input with in a python script using subprocess.

Problemi correlati