2010-01-14 5 views
9

Il seguente codice:Quali autorizzazioni sono richieste per il sottoprocesso.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) 

Provoca l'questo errore quando si chiama l'ultima riga vale a dire 'conversione =' in 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 

Ho provato chmod 777 /Users/jondoe/development/mdb-export - cos'altro potrebbe essere richiesto?

risposta

7

Sembra l'errore "Autorizzazioni negate" proveniva originariamente da Popen che tentava di eseguire mdb-export dalla posizione sbagliata (e di aggiungere elementi, con le autorizzazioni sbagliate).

Se è installato mdbtools, il seguente funziona bene ed eredita le autorizzazioni corrette, senza bisogno di sudo ecc

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

(Vale la pena notare, mi sono fatto in un pasticcio per un po ', avendo dimenticato che Popen è per l'apertura di file eseguibili, non le cartelle o file non exectable in cartelle)

Grazie per tutte le vostre risposte, tutti hanno fatto una lettura interessante a prescindere :)

0

È inoltre necessario garantire autorizzazioni di lettura ed esecuzione per l'utente che esegue tale codice nelle directory lungo la catena:/Users,/Users/jondoe e/Users/jondoe/development.

+0

ho fatto un'altra cartella/mdb-export in radice (didn' t impostazione di fantasia chmod 777 su/Utenti) e chmod'ed a 777. Lo stesso errore ancora. –

1

Si può alimentare "sudo" al sottoprocesso? Vedi questo SO thread.

@ Jon Hadley, dall'interprete:

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

Dal Terminal su OS X, devo fare sudo quando si esegue lo script:

$ sudo python test.py 

allora questo (in test.py) fornisce la stessa uscita di prima:

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

Ottenere il sottoprocesso per gestire direttamente l'autenticazione da uno script è probabile Non è una buona idea, dal momento che nasconde l'escalation dei privilegi. Ma si potrebbe guardare pexpect e questo SO answer.

+0

Dare una prova. C'è un modo per vedere quale utente è in esecuzione il mio processo Python? –

+0

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

11

Supponendo che i permessi sulle cartelle principali sono corretti (vale a dire tutte le cartelle superiori dovrebbero avere + x permesso), prova ad aggiungere:

shell=True 

al comando Popen come ad esempio:

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

Funziona con sottoprocesso.check_output, Grazie! – jedema

+0

questo era il mio problema, grazie! – Anentropic