2010-01-14 12 views
9

Le code suivant:Quelles sont les autorisations requises pour subprocess.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) 

provoque la cette erreur lorsque vous appelez la dernière ligne à savoir la 'conversion =' dans 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 

J'ai essayé chmod 777 /Users/jondoe/development/mdb-export - quoi d'autre pourrait être nécessaire?

Répondre

7

Il semble l'erreur "Permissions refusées" provenait originellement de Popen essayant d'exécuter mdb-export à partir du mauvais emplacement (et de compliquer les choses, avec les mauvaises permissions).

Si mdbtools est installé, ce qui suit fonctionne très bien et hérite des autorisations correctes sans avoir besoin de sudo etc.

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

(A noter, je me suis entré dans une pagaille pendant un certain temps, ayant oublié que Popen est pour l'ouverture, executables pas des dossiers ou des fichiers non exectable dans des dossiers)

Merci pour toutes vos réponses, ils ont tous fait une lecture intéressante :) quel que soit

0

Vous devez également vous assurer de lire et d'exécuter les autorisations pour l'utilisateur exécutant ce code sur les répertoires de la chaîne -/Users,/Users/jondoe et/Users/jondoe/development.

+0

J'ai fait un autre dossier/mdb-export dans la racine (n » ai pas t fantaisie réglage chmod 777 sur/Utilisateurs) et l'a chmodé à 777. Même erreur encore. –

1

Pouvez-vous alimenter "sudo" en sous-processus? Voir ce SO thread.

Hadley @ Jon, de l'interprète:

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

Depuis le terminal sur OS X, je dois faire sudo quand je lance le script:

$ sudo python test.py 

alors ce (en test.py) donne le même résultat que précédemment:

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

Obtenir subprocess gérer directement l'authentification à partir d'un script est probabl y pas une bonne idée, car elle cache l'escalade de privilèges. Mais vous pouvez regarder pexpect et ce SO answer.

+0

Essayez-le. Existe-t-il un moyen de voir quel utilisateur utilise mon processus Python? –

+0

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

11

Si l'on suppose que les autorisations sur les dossiers parents sont corrects (ie tous les dossiers parents doivent avoir + x permission), essayez d'ajouter:

shell=True 

à la commande Popen tels que:

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

Fonctionne avec subprocess.check_output, merci! – jedema

+0

c'était mon problème, merci! – Anentropic