subprocess.Popen需要什么权限?

13 投票
4 回答
48674 浏览
提问于 2025-04-15 18:02

下面的代码:

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 个回答

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 回答

18

假设父文件夹的权限设置是正确的(也就是说,所有父文件夹都应该有 +x 的权限),你可以尝试添加:

shell=True

到 Popen 命令中,比如:

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

看起来“权限被拒绝错误”最初是因为 Popen 尝试在错误的位置执行 mdb-export,而且权限也设置错了。

如果安装了 mdbtools,下面的代码就能正常工作,并且会自动继承正确的权限,不需要使用 sudo 等命令。

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

值得一提的是,我一度搞混了,因为我忘了 Popen 是用来打开可执行文件的,而不是用来打开文件夹或文件夹里的非可执行文件。

感谢大家的回复,虽然问题不同,但都让我觉得很有趣 :)

撰写回答