0

我正在尝试从 python 调用 shell (Bash) 脚本。该脚本位于我的 /home/user/bin 目录中,具有组和用户的执行权限,即-rwxr-xr--. 我正在使用subprocess.check_call(["/home/user/bin/script.sh %s %s" % (subj,-6)],shell=True),这正在生成退出状态 127 代码。添加stderr=subprocess.STDOUT到命令中没有任何意义。这是确切的输出:

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

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

提前致谢

4

1 回答 1

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仅在非常罕见的情况下才需要,在这种情况下,您需要在启动您尝试运行的程序之前执行重定向或逻辑,并且如果将任何未经审查的输入合并到正在运行的命令中,则会带来严重的安全问题。除非您非常非常确定需要,否则不要使用它。

于 2013-09-20T23:56:57.950 回答