如何从Python文件调用远程shell脚本?
我想知道是否可以从一个Python程序中调用一个shell脚本,但这个shell脚本不在与Python文件相同的目录里?
目前为止,我只成功调用了一个与调用它的Python文件在同一目录下的shell脚本,使用的命令是:
所以基本上,在我需要做的程序中,我不能改变我的bash脚本的位置,所以我必须找到一种方法从我的Python文件中调用这个bash脚本(而且它们不在同一路径下)>
subprocess.call(["./my_shell_script.sh",my_argument])
谢谢,
解决方案:
subprocess.call(["the/path/to/the/script/script.sh"])
Jordane
3 个回答
0
如果你遇到问题,可以打开一个完整的进程:
p = subprocess.Popen(['/path/to/script','arg1','arg2'], stdout=subprocess.PIPE)
stdout,stderr = p.communicate()
你也可以把它设置成命令行模式。这样的话,操作系统就可以按照你更熟悉的方式来处理事情。
我假设你的路径里没有什么奇怪的字符吧?
1
你应该始终传递脚本的完整路径:
import shlex
import subprocess
cmd = '/bin/bash /home/jordane/scripts/script.sh -opt 1 arg1 arg2'
subprocess.call(shlex.split(cmd))
1
./my_shell_script.sh
的意思是 "在当前工作目录下的 my_shell_script
"。
你有没有试过用脚本的 绝对路径 来替换它呢?
subprocess.call(["/full/path/to/my_shell_script.sh",my_argument])
或者,如果你的脚本路径在当前的 PATH环境变量中:
subprocess.call(["my_shell_script.sh",my_argument])
或者再说一次(如果你的脚本路径在当前的 PATH 中):
subprocess.call(["bash", "-c", " ".join("my_shell_script.sh",my_argument)])
从上面的内容来看,第一和第二种解决方案需要在脚本的第一行加上一个合适的 shebang(#!/bin/bash
)。而第三种解决方案没有这个“限制”。
编辑:
如果你想启动一个相对于当前工作目录的脚本,你需要提供一个 相对路径。这样,无论你的 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])
上面的例子会在 a/b/c
子目录中启动 my_shell_script
,而这个子目录是从当前工作目录向上 两级 的位置。