Какие полномочия требуются для подпроцесса. 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)

Вызывает эту ошибку при вызове последней строки т.е. 'преобразования =' в 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 - что еще могло бы требоваться?

10
задан Jon Hadley 19 January 2010 в 15:13
поделиться

4 ответа

Кажется, что «разрешение запрещено ошибка» была ориентирована от POPEN, пытаясь выполнить MDB-экспорт из неправильного местоположения (и составлять вещи, с неправильными разрешениями).

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

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

(стоит отметить, я на некоторое время заставил себя в путаницу, забыл, что Pofen для открытия исполняемых файлов, Не папки или неактуальные файлы в папках)

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

8
ответ дан 3 December 2019 в 17:58
поделиться

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

0
ответ дан 3 December 2019 в 17:58
поделиться

Можете ли вы кормить «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 и это так Ответ .

1
ответ дан 3 December 2019 в 17:58
поделиться

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

shell=True

к команде Popen, например:

subprocess.Popen(("/Users/jondoe/development/mdb-export", mdb.name, tbl,), stdout=csv, shell=True)
13
ответ дан 3 December 2019 в 17:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: