2010-01-14 10 views
9

El siguiente código:¿Qué permisos se requieren para el subproceso.Popen?

gb = self.request.form['groupby'] 
typ = self.request.form['type'] 
tbl = self.request.form['table'] 

primary = self.request.form.get('primary', None) 

if primary is not None: 
    create = False 
else: 
create = True 

mdb = tempfile.NamedTemporaryFile() 
mdb.write(self.request.form['mdb'].read()) 
mdb.seek(0) 

csv = tempfile.TemporaryFile() 
conversion = subprocess.Popen(("/Users/jondoe/development/mdb-export", mdb.name, tbl,),stdout=csv) 

Causas del este error cuando se llama a la última línea es decir, 'conversión =' en OS X.

Traceback (innermost last): 
    Module ZPublisher.Publish, line 119, in publish 
    Module ZPublisher.mapply, line 88, in mapply 
    Module ZPublisher.Publish, line 42, in call_object 
    Module circulartriangle.mdbtoat.mdb, line 62, in __call__ 
    Module subprocess, line 543, in __init__ 
    Module subprocess, line 975, in _execute_child 
OSError: [Errno 13] Permission denied 

He intentado chmod 777 /Users/jondoe/development/mdb-export - ¿qué otra cosa podría ser necesario?

Respuesta

7

Parece el 'Permisos denegados de error' provenía originalmente de Popen tratando de ejecutar mdb-export desde la ubicación incorrecta (y de cosas compuestas, con los permisos incorrectos).

Si se instala mdbtools, la siguiente funciona bien y hereda los permisos correctos sin necesidad de sudo etc.

subprocess.Popen(("mdb-export", mdb.name, tbl,),stdout=csv) 

(A tener en cuenta, me metí en un lío por un tiempo, después de haber olvidado que Popen es para la apertura de archivos ejecutables, no carpetas o archivos que no son exectable en carpetas)

Gracias por todas sus respuestas, todos ellos hacen una lectura interesante, independientemente :)

0

También debe asegurarse de leer y ejecutar permisos para el usuario que ejecuta ese código en los directorios de la cadena -/Users,/Users/jondoe y/Users/jondoe/development.

+0

hice otra carpeta/MDB-exportación de raíz (no me paré' t elegante configuración chmod 777 en/Usuarios) y lo modificó a 777. Mismo error todavía. –

1

¿Se puede alimentar "sudo" al subproceso? Vea esto SO thread.

@ Jon Hadley, desde el intérprete:

>>> import subprocess 
>>> p = subprocess.call(['sudo','/usr/bin/env']) 
PASSWORD: 
[snip] 

USER=root 
USERNAME=root 
SUDO_COMMAND=/usr/bin/env 
SUDO_USER=telliott99 
SUDO_UID=501 
SUDO_GID=20 

Desde la terminal en OS X, que tiene que hacer sudo cuando corro el guión:

$ sudo python test.py 

entonces este (en test.py) da el mismo resultado que antes:

import subprocess 
p = subprocess.Popen('/usr/bin/env') 

Obtención de subproceso para manejar directamente la autenticación de un script es probable y no es una buena idea, ya que oculta la escalada de privilegios. Pero podría mirar pexpect y SO answer.

+0

Dando una oportunidad. ¿Hay alguna manera de ver qué usuario está ejecutando mi proceso de Python? –

+0

@Jon Hadley >>> import os >>> os.getenv ('USER') 'telliott99' – telliott99

11

Suponiendo que los permisos en las carpetas principales son correctos (es decir, todas las carpetas principales deben tener + x permiso), trate de añadir:

shell=True 

al comando Popen tales como:

subprocess.Popen(("/Users/jondoe/development/mdb-export", mdb.name, tbl,), stdout=csv, shell=True) 
+0

Funciona con subprocess.check_output, ¡Gracias! – jedema

+0

este fue mi problema, ¡gracias! – Anentropic

Cuestiones relacionadas