python子进程模块调用shell(Bash)脚本

时间:2013-09-20 23:55:45

标签: python bash subprocess

我试图从python调用shell(Bash)脚本。该脚本位于我的/ home / user / bin目录中,具有group&amp ;;的执行权限。用户,即-rwxr-xr--。我正在使用subprocess.check_call(["/home/user/bin/script.sh %s %s" % (subj,-6)],shell=True),这将生成退出状态127代码。在命令中添加stderr=subprocess.STDOUT无需解释。这是确切的输出:

  

CalledProcessError:Command   '['/home/.../bin/MNE_setup_source_space.sh kubi_td104 -6']'   返回非零退出状态127`

我相信这可能是与PATH相关的问题,这是正确的吗?我不知道如何解决这个问题。如果我已经传递了可执行文件的绝对路径,那么会出现PATH问题吗?

提前致谢

1 个答案:

答案 0 :(得分:1)

请勿使用shell=True。不要将参数作为argv[0]的一部分传递。将您的参数向量作为向量传递 - 也就是说,在Python中,列表:

subprocess.check_call(["/home/user/bin/script.sh", str(subj), "-6"])

如果你 要使用shell=True,你会这样做:

subprocess.check_call("/home/user/bin/script.sh %s %s" % (subj,-6), shell=True)

...也就是说,根本不会使用列表表单。


为了澄清为什么你当前正在尝试失败 - 因为你正在使用shell=True,它试图只将第一个列表元素作为脚本传递,并将其他参数作为额外的argv元素传递如果在第一个参数中传递的脚本选择查看它们(通过引用"$1""$2"等),则可以读取或解释。

shell=True仅在非常罕见的情况下才需要在启动您尝试运行的程序之前需要shell执行重定向或逻辑,并且如果任何unvetted输入包含在内,则会出现严重的安全问题命令正在运行。除非你非常非常确定你需要,否则不要使用它。