Следующий код:
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)
Вызывает эту ошибку при вызове последней строки т.е. 'преобразования =' в 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
- что еще могло бы требоваться?
Кажется, что «разрешение запрещено ошибка» была ориентирована от POPEN, пытаясь выполнить MDB-экспорт из неправильного местоположения (и составлять вещи, с неправильными разрешениями).
Если MDBTOOLS установлен, следующее работает нормально и наследует правильные разрешения без необходимости в Sudo и т. Д.
subprocess.Popen(("mdb-export", mdb.name, tbl,),stdout=csv)
(стоит отметить, я на некоторое время заставил себя в путаницу, забыл, что Pofen для открытия исполняемых файлов, Не папки или неактуальные файлы в папках)
Спасибо за все ваши ответы, все они сделаны для интересного чтения независимо от :)
Вам также необходимо убедиться в том, что пользователь, выполняющий этот код в каталогах вверх по цепочке - /Users, /Users/jondoe и /Users/jondoe/ development, имеет права на чтение и выполнение.
Можете ли вы кормить «Sudo» на подпроцесс? Смотрите это так нить .
@Jon Hadley, от переводчика:
>>> 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
из терминала на ОС X, я должен сделать sudo, когда я запускаю скрипт:
$ sudo python test.py
, то это (в Test.py) дает тот же выход, что и раньше:
import subprocess
p = subprocess.Popen('/usr/bin/env')
Получение подпроцесса напрямую обрабатывать аутентификацию из сценария, вероятно, не очень хорошая идея, поскольку она скрывает эскалацию привилегии. Но вы могли бы посмотреть PEXPECT и это так Ответ .
Предполагая, что права на родительские папки правильные (т.е. все родительские папки должны иметь права +x), попробуйте добавить:
shell=True
к команде Popen, например:
subprocess.Popen(("/Users/jondoe/development/mdb-export", mdb.name, tbl,), stdout=csv, shell=True)