2010-01-14 126 views
9

下面的代码: - 可能需要什么subprocess.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导致这个错误?

回答

7

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

如果安装mdbtools,下面的工作正常,并继承了正确的权限,而不需要使用sudo等

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

(值得注意的是,我让自己陷入到了一段混乱,已经忘记了POPEN是在文件夹中打开可执行文件,没有文件夹或非exectable文件)

感谢您的回复,他们都有趣的阅读使无论:)

0

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

+0

我做了根另一个文件夹/ MDB出口(没”花哨的设置chmod 777 on/Users)并chmod'ed到777.同样的错误仍然存​​在。 – 2010-01-15 07:28:42

1

你可以提供“sudo”到子进程吗?看到这个SO thread

@乔恩哈德利,从解释:

>>> 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 python test.py 

那么这(在test.py )给出与以前相同的输出:

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

获取子进程直接处理脚本的身份验证是probabl你不是一个好主意,因为它隐藏了特权升级。但你可以看看pexpect和这个SO answer

+0

试一试。有没有办法查看我的Python进程正在运行的用户? – 2010-01-18 16:49:35

+0

@Jon Hadley >>> import os >>> os.getenv('USER') 'telliott99' – telliott99 2010-01-18 17:49:42

11

假设在父文件夹的权限是正确的(即所有父文件夹应该有+ X许可),试着加入:

shell=True 

到POPEN命令,例如:

subprocess.Popen(("/Users/jondoe/development/mdb-export", mdb.name, tbl,), stdout=csv, shell=True) 
+0

它适用于subprocess.check_output,谢谢! – jedema 2015-09-04 10:01:09

+0

这是我的问题,谢谢! – Anentropic 2016-02-15 10:44:51

相关问题