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

0 投票
3 回答
1296 浏览
提问于 2025-04-18 13:50

我想知道是否可以从一个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,而这个子目录是从当前工作目录向上 两级 的位置。

撰写回答