我想知道是否可以从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
答案 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模式。 通过这种方式,您可以让操作系统以您更熟悉的方式处理事务。
我认为你的路径里面没有任何奇怪的字符?