13

以下代码:

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 中调用最后一行即 'conversion =' 时导致此错误。

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

4 回答 4

16

假设父文件夹的权限是正确的(即所有父文件夹都应该有 +x 权限),尝试添加:

shell=True

到 Popen 命令,例如:

subprocess.Popen(("/Users/jondoe/development/mdb-export", mdb.name, tbl,), stdout=csv, shell=True)
于 2010-01-18T18:30:47.107 回答
8

似乎“权限被拒绝错误”最初来自 Popen 试图从错误的位置执行 mdb-export (并使用错误的权限来复合事物)。

如果安装了 mdbtools,以下工作正常并继承正确的权限,而无需 sudo 等。

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

(值得注意的是,我让自己陷入了一阵混乱,忘记了 Popen 是用于打开可执行文件,而不是文件夹或文件夹中的不可执行文件)

Thanks for all your responses, they all made for interesting reading regardless :)

于 2010-01-19T14:53:51.603 回答
2

你能把“sudo”喂给子进程吗?请参阅此 SO线程

@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

从 OS X 上的终端,我必须在运行脚本时执行 sudo:

$ sudo python test.py

然后这个(在 test.py 中)给出与以前相同的输出:

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

让子进程直接从脚本处理身份验证可能不是一个好主意,因为它隐藏了权限提升。但是你可以看看pexpect和这个 SO answer

于 2010-01-18T15:09:13.917 回答
0

您还需要确保在链上目录(/Users、/Users/jondoe 和 /Users/jondoe/development)上运行该代码的用户具有读取和执行权限。

于 2010-01-14T17:32:40.800 回答