subprocess.Popen 需要啥权限?
Posted
技术标签:
【中文标题】subprocess.Popen 需要啥权限?【英文标题】:What permissions are required for subprocess.Popen?subprocess.Popen 需要什么权限? 【发布时间】:2011-01-05 04:22:35 【问题描述】:以下代码:
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
- 还需要什么?
【问题讨论】:
【参考方案1】:假设父文件夹的权限是正确的(即所有父文件夹都应该有 +x 权限),尝试添加:
shell=True
到Popen命令如:
subprocess.Popen(("/Users/jondoe/development/mdb-export", mdb.name, tbl,), stdout=csv, shell=True)
【讨论】:
【参考方案2】:似乎“权限被拒绝错误”最初来自 Popen 试图从错误的位置执行 mdb-export(并使用错误的权限来复合事物)。
如果安装了 mdbtools,以下工作正常,并且无需 sudo 等即可继承正确的权限。
subprocess.Popen(("mdb-export", mdb.name, tbl,),stdout=csv)
(值得注意的是,我让自己陷入了一阵混乱,忘记了 Popen 是用于打开可执行文件,而不是文件夹或文件夹中的不可执行文件)
感谢您的所有回复,无论如何,它们都让阅读变得有趣:)
【讨论】:
我知道已经有一段时间了,但我也遇到了这个问题。您是否有机会详细说明您是如何发现 Popen 试图从错误的位置和使用错误的权限执行mdb-export
的?【参考方案3】:
你能把“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。
【讨论】:
试试看。有没有办法查看我的 Python 进程以哪个用户身份运行? @Jon Hadley >>> 导入操作系统 >>> os.getenv('USER') 'telliott99'【参考方案4】:您还需要确保在链上的目录(/Users、/Users/jondoe 和 /Users/jondoe/development)上运行该代码的用户具有读取和执行权限。
【讨论】:
我在根目录下创建了另一个文件夹 /mdb-export(不想在 /Users 上设置 chmod 777)并将其修改为 777。同样的错误。以上是关于subprocess.Popen 需要啥权限?的主要内容,如果未能解决你的问题,请参考以下文章
subprocess.call() 和 subprocess.Popen() 之间有啥区别使 PIPE 对前者的安全性降低?
subprocess.Popen("echo $HOME"... 和 subprocess.Popen(["echo", "$HOME"]