Какие разрешения требуются для подпроцесса. Открыть? - PullRequest
10 голосов
/ 14 января 2010

следующий код:

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)

Вызывает эту ошибку при вызове последней строки, т. Е. 'Translation =' в 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

Я пробовал chmod 777 /Users/jondoe/development/mdb-export - что еще может потребоваться?

Ответы [ 4 ]

12 голосов
/ 18 января 2010

Предполагая, что разрешения для родительских папок правильные (то есть все родительские папки должны иметь разрешение + x), попробуйте добавить:

shell=True

для команды Popen, такой как:

subprocess.Popen(("/Users/jondoe/development/mdb-export", mdb.name, tbl,), stdout=csv, shell=True)
8 голосов
/ 19 января 2010

Кажется, что «Ошибка в разрешении отклонена» изначально исходила от Попена, пытающегося выполнить mdb-export из неправильного местоположения (и для составных вещей с неправильными разрешениями).

Если установлен mdbtools, следующее работает нормально и наследует правильные разрешения без необходимости sudo и т. Д.

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

(Стоит отметить, что я на какое-то время запутался, забыв, что Popen предназначен для открытия исполняемых файлов, а не папок или неэкспонируемых файлов в папках)

Спасибо за все ваши ответы, все они сделаны для интересного чтения независимо от:)

1 голос
/ 18 января 2010

Можете ли вы передать "sudo" в подпроцесс? Смотрите эту SO тему .

@ Джон Хэдли, от переводчика:

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

Из терминала на OS X, я должен сделать sudo, когда я запускаю скрипт:

$ sudo python test.py

тогда это (в test.py) дает тот же вывод, что и раньше:

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

Получение подпроцесса для непосредственной обработки аутентификации из скрипта, вероятно, не очень хорошая идея, так как скрывает повышение привилегий. Но вы можете посмотреть на pexpect и этот SO ответ .

0 голосов
/ 14 января 2010

Вам также необходимо обеспечить разрешения на чтение и выполнение для пользователя, выполняющего этот код в каталогах в цепочке - / Users, / Users / jondoe и /Users/jondoe/development.

.
...