2011-01-25 11 views
18

Sto cercando di passare le mie variabili da raw_input al mio comando di sottoprocesso. Sono nuovo di Python. Qualsiasi aiuto avrebbe apprezzato.Passaggio di variabili a una chiamata di sottoprocesso

#!/usr/bin/python 

import subprocess 

print "\nWhat user name" 
username = str(raw_input('username: ')) 
print "\nWhat is the user id" 
userid = int(raw_input('Enter user id: ')) 
print "\nWhat is the user\'s primary group?" 
primarygroup = int(raw_input('Enter group: ')) 
print "\nWhat is the user\'s secondary group?" 
secondarygroup = int(raw_input('Enter group: ')) 

subprocess.call(['useradd' '-m' '-g' _primarygroup '-G' _secondarygroup '-u' _userid _username]) 

print"\nThe user has been added" 
+4

Che problema stai riscontrando? Per favore sii specifico –

+0

"essere specifici" è - si spera - un modo per n00bz di pensare un po 'più chiaramente al loro problema. –

+1

Davvero vecchio, ma noterò che, ad esempio, il gruppo principale è stato letto in 'primarygroup', ma poi ha tentato di accedere tramite' _primarygroup'. – altendky

risposta

19

Prova separare i valori tramite virgola:

subprocess.call(['useradd', '-m', '-g', _primarygroup, '-G', _secondarygroup, '-u', _userid, _username]) 

Vedi http://docs.python.org/library/subprocess.html#subprocess.call - Prende un array in cui il primo argomento è il programma e tutti gli altri argomenti vengono passati come argomenti al programma.

Inoltre, non dimenticare di controllare il valore restituito della funzione per un codice di ritorno pari a zero che significa "successo" a meno che non sia importante per lo script se l'utente è stato aggiunto correttamente o meno.

+0

Sto provando a passare il valore dato da raw_input alla mia chiamata di sottoprocesso. – rsouthard

3

tenta di aggiungere virgole tra le voci di elenco:

subprocess.call(['useradd', '-m', '-g', _primarygroup, '-G', _secondarygroup, \ 
       '-u' ,_userid, _username]) 

subprocess.call prende gli stessi argomenti come subprocess.Popen:

args dovrebbe essere una stringa, oppure una sequenzadi argomenti del programma.


Modifica

per disattivare tutte le argomentazioni in stringhe in una sola volta si potrebbe voi una lista di comprensione:

args = ['useradd', '-m', '-g', _primarygroup, '-G', _secondarygroup, \ 
     '-u' ,_userid, _username] 
str_args = [ str(x) for x in args ] 
+0

Sfortunatamente i valori per _primarygroup, _secondarygroup e _username devono essere numeri interi. IE: useradd -g 501 -503 -u 501 – rsouthard

+0

Forse il tuo problema è con la shell. Gli argomenti relativi a programmi e script possono essere sempre passati come stringhe (ad esempio, viene passata la stringa "501" anziché il numero intero 501). È il processo chiamato per analizzare queste stringhe nel formato corretto. – Dunes

+0

Puoi trasformare i tuoi argomenti in stringhe prima di passarle a 'call'; vedi la mia modifica. – miku

0
subprocess.call(['useradd', '-m','-g', _primarygroup, '-G', _secondarygroup, '-u', _userid, _username]) 

passare un list-subprocess.call

0

È possibile creare prima la stringa arg e poi passare appena questa variabile al subprocess.call. Ad esempio:

projects_csv_fn = 'projects_csv_2.csv' 
prjects_json_fn = 'projects.json' 

args ='python json_to_csv.py id ' + prjects_json_fn + ' ' + projects_csv_fn 

subprocess.call(args, shell=True) 
Problemi correlati