如何从python文件中调用远程shell脚本?

时间:2014-07-18 12:02:57

标签: python bash

我想知道是否可以从python程序调用shell脚本,但shell脚本与python文件不在同一目录中? 目前我只是成功调用了一个shell脚本,该脚本位于与调用它的python文件相同的目录中,这要归功于这个命令:

所以基本上,在我必须做的程序中,我无法改变我的bash脚本的位置,所以我必须找到一种方法从我的python文件调用这个bash脚本(qnd没有相同的路径)>

subprocess.call(["./my_shell_script.sh",my_argument])                                                                             

谢谢,

SOLUTION:

subprocess.call(["the/path/to/the/script/script.sh"])

Jordane

3 个答案:

答案 0 :(得分:1)

您应该始终传递脚本的完整路径:

import shlex
import subprocess

cmd = '/bin/bash /home/jordane/scripts/script.sh -opt 1 arg1 arg2'
subprocess.call(shlex.split(cmd))

答案 1 :(得分:1)

./my_shell_script.sh表示当前工作目录中的my_shell_script

您是否尝试将 absolute path 替换为您的脚本?

subprocess.call(["/full/path/to/my_shell_script.sh",my_argument])

或者,如果您的脚本路径位于当前PATH environment variable

subprocess.call(["my_shell_script.sh",my_argument])

或者再次(如果你的脚本路径在你当前的路径中):

subprocess.call(["bash", "-c", " ".join("my_shell_script.sh",my_argument)])

从上面开始,第一个和第二个解决方案需要一个正确的 shebang #!/bin/bash)作为脚本的第一行。第三种解决方案没有这种“限制”。


修改

如果您要启动其路径相对于当前工作目录的脚本,则必须提供relative path。这样,只要相对位置不会改变,您的Python脚本和Shell脚本就可以在周围移动。

例如,如果脚本位于当前工作目录的子目录my_subdir中,则可以写:

subprocess.call(["my_subdir/my_shell_script.sh",my_argument])

您还必须使用..向上导航到一个级别。你可以多次使用它来提升几个级别。例如:

subprocess.call(["../../a/b/c/my_shell_script.sh",my_argument])

以上示例将在当前工作目录上方两级my_shell_script子目录中启动a/b/c

答案 2 :(得分:0)

如果你遇到困难,你可以打开一个完整的过程:

p = subprocess.Popen(['/path/to/script','arg1','arg2'], stdout=subprocess.PIPE)
stdout,stderr = p.communicate()

您也可以将其设置为shell模式。 通过这种方式,您可以让操作系统以您更熟悉的方式处理事务。

我认为你的路径里面没有任何奇怪的字符?