我试图从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问题吗?
提前致谢
答案 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输入包含在内,则会出现严重的安全问题命令正在运行。除非你非常非常确定你需要,否则不要使用它。