以下代码:
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
- 可能还需要什么?
答案 0 :(得分:12)
假设父文件夹的权限正确(即所有父文件夹应具有+ x权限),请尝试添加:
shell=True
到Popen命令,例如:
subprocess.Popen(("/Users/jondoe/development/mdb-export", mdb.name, tbl,), stdout=csv, shell=True)
答案 1 :(得分:8)
似乎'Permissions denied error'来自Popen尝试从错误的位置执行mdb-export(以及使用错误的权限复合内容)。
如果安装了mdbtools,以下工作正常并且继承了正确的权限,而不需要sudo等。
subprocess.Popen(("mdb-export", mdb.name, tbl,),stdout=csv)
(值得注意的是,我忘记了Popen是打开可执行文件,而不是文件夹中的文件夹或不可检索的文件)。
感谢您的所有回复,无论如何,他们都为有趣的阅读做了准备:)
答案 2 :(得分:1)
你可以将“sudo”提供给子进程吗?请参阅此SO thread。
来自翻译的@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。
答案 3 :(得分:0)
您还需要确保在链上的目录上运行该代码的用户的读取和执行权限 - / Users,/ Users / jondoe和/ Users / jondoe / development。