2011-01-25 15 views
18

Estoy intentando pasar mis variables de raw_input a mi comando de subproceso. Soy nuevo en Python. Cualquier ayuda sería apreciada.Pasar variables a una llamada de subproceso

#!/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

¿Qué problema tienes? Por favor sea especifico. –

+0

El "ser específico" es - con suerte - una forma de que n00bz piense un poco más claramente sobre su problema. –

+1

Realmente viejo, pero notaré que, por ejemplo, el grupo primario se leyó en 'primarygroup' pero luego se intentó acceder a través de' _primarygroup'. – altendky

Respuesta

19

Trate separando los valores con comas:

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

Ver http://docs.python.org/library/subprocess.html#subprocess.call - Se necesita una matriz en donde el primer argumento es el programa y todos los demás argumentos son pasados ​​como argumentos para el programa.

Además, no olvide verificar el valor de retorno de la función para un código de retorno cero que significa "éxito" a menos que no importe para su secuencia de comandos si el usuario se agregó con éxito o no.

+0

Estoy tratando de pasar el valor dado desde raw_input a mi llamada de subproceso. – rsouthard

3

intenta agregar comas entre los elementos de lista:

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

subprocess.call toma los mismos argumentos que subprocess.Popen:

args debe ser una cadena o una secuencia de argumentos del programa.


Edición

para apagar todas las discusiones en cadenas a la vez que podría usted una lista de comprensión:

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

Lamentablemente, los valores para _primarygroup, _secondarygroup y _username deben ser enteros. IE: useradd -g 501 -503 -u 501 – rsouthard

+0

Tal vez su problema es con el shell. Los argumentos a los programas y scripts solo se pueden pasar como cadenas (por ejemplo, se pasa la cadena '501' en lugar del entero 501). Es el proceso llamado para analizar estas cadenas en el formato correcto. – Dunes

+0

Puede convertir sus argumentos en cadenas antes de pasarlos a 'call'; ver mi edición – miku

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

pasar una list-subprocess.call

0

Puede crear la cadena arg primero y luego pasar esta variable al subprocess.call. Por ejemplo:

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) 
Cuestiones relacionadas