2010-01-14 4 views
9

Der folgende Code:Welche Berechtigungen sind für subprocess.Popen erforderlich?

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) 

Ursachen der diesen Fehler, wenn die letzte Zeile d 'Umwandlung =' Aufruf 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 

Ich habe chmod 777 /Users/jondoe/development/mdb-export versucht - was sonst erforderlich sein könnten?

Antwort

7

Es scheint, der 'Permissions denied error' kam ursprünglich von Popen, der versuchte, mdb-export vom falschen Ort auszuführen (und Dinge mit den falschen Rechten zu vermischen).

Wenn mdbtools installiert ist, wird die folgende funktioniert gut und erbt die richtigen Berechtigungen, ohne die Notwendigkeit für sudo usw.

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

(Bemerkenswert, ich habe mich in einen Wirrwarr für eine Weile vergessen zu haben, dass Popen ist ausführbare Dateien zum Öffnen, keine Ordner oder nicht-exectable Dateien in Ordnern)

Vielen Dank für Ihre Antworten, sie alle unabhängig für eine interessante Lektüre gemacht :)

0

Sie müssen auch Lese- und Ausführungsberechtigungen für den Benutzer sicherstellen, der diesen Code in den Verzeichnissen in der Kette -/Users,/Users/jondoe und/Users/jondoe/development ausführt.

+0

ich einen anderen Ordner/mdb-Export in root (didn‘gemacht t Phantasie Einstellung chmod 777 auf/Benutzer) und chmod'ed es zu 777. Der gleiche Fehler noch. –

1

Können Sie "Sudo" zum Subprozess füttern? Siehe hierzu SO thread.

@ Jon Hadley, vom Dolmetscher:

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

Vom Terminal auf OS X, ich habe sudo zu tun, wenn ich das Skript ausführen:

$ sudo python test.py 

dann diese (in test.py) gibt die gleiche Ausgabe wie zuvor:

Unterprozess direkt die Authentifizierung von einem Skript behandeln ist wahrscheinlich y keine gute Idee, da es die Eskalation von Privilegien verbirgt. Aber Sie könnten pexpect und diese SO answer betrachten.

+0

Einen Versuch geben. Gibt es eine Möglichkeit zu sehen, welcher Benutzer in meinem Python-Prozess läuft? –

+0

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

11

Unter der Annahme, dass die Berechtigungen für übergeordnete Ordner korrekt sind (dh alle übergeordneten Ordner sollten + x Berechtigung haben), versuchen Sie:

shell=True 

zum Popen Befehl wie:

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

Es funktioniert mit subprocess.check_output, Danke! – jedema

+0

das war mein Problem, danke! – Anentropic