繁体   English   中英

subprocess.call 拒绝运行 shell 脚本的权限

[英]Permission denied to run shell script by subprocess.call

我使用 python 编写了 shell 脚本,它在我的终端上通过命令bash download_R1.sh成功运行。

我想测试子进程是否可以在 python 中做同样的事情,因为我想在 python 脚本中集成一个管道。 这是我的代码的子流程部分:

downR1 = subprocess.call('./download_R1.sh')

它无法运行脚本并显示以下错误消息:

Error message:
PermissionError: [Errno 13] Permission denied: './download_R1.sh'

有人建议使用chmod +x来获得该脚本的身份验证。 但是bash down.sh正在工作。 不知道哪一部分出了问题。

有什么建议吗?

这是 shell 的正常行为方式。

如果程序或脚本没有执行权限( +x ),则不能直接运行它

但是,您可以指示其他程序bashpython或其他程序运行文件,即使没有+x

foo.sh

#!/bin/bash

# If a parameter is received in the command $1, assign it to $NAME
# if not use the default "World"
NAME="${1:-World}"

echo "Hello ${NAME}"

foo.py

#!/usr/bin/env python
print "Hello World"
$ bash foo.sh
Hello World

$ bash foo.sh Person
Hello Person

$ ./foo.sh
bash: ./foo.sh: Permission denied

$ python foo.py
Hello World


$ ./foo.py
bash: ./foo.sh: Permission denied

$ chmod +x foo.sh foo.py

$ ./foo.sh
Hello World
$ ./foo.py
Hello World

在您的情况下,如果您想使用subprocess进程运行程序但不授予文件执行权限,则必须使用:

subprocess.run(["bash", "download_R1.sh"])

如果您需要将 arguments 传递给脚本,只需将更多项目添加到列表中:

subprocess.run(["bash", "download_R1.sh", "argument1"])

关于使用 arguments 的子流程有几个问题, 比如这个

如果您更喜欢仅在一个字符串中编写命令,建议不要使用shell=True 但是你可以使用类似的东西:

subprocess.run("bash download_R1.sh argument1".split())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM