尝试使用 Python 脚本编写 Bash 时未找到命令

尝试使用 Python 脚本编写 Bash 时未找到命令

看完这些视频后,我尝试从 Python 脚本运行 bash 命令(12)。这是我第一次尝试这个。

我的脚本:

import os
import subprocess

os.system("cd Downloads/smartgit")
#  os.system("cd Downloads/smartgit/bin")
#  os.system('sudo "bin/smartgit.sh"')
#  os.system("sudo bin/smartgit.sh")
#  os.system("sudo ./smartgit.sh")
#  subprocess.call("./smargit.sh", shell=True)
#  subprocess.call("sudo ./smargit.sh", shell=True)
#  subprocess.call("sudo smargit.sh", shell=True)
subprocess.call("bin/smargit.sh", shell=True)

您可以看到我之前的版本被注释掉了。我修改了文件,但这个文件没有被修改:

malikarumi@Tetuoan2:~/Downloads/smartgit/bin$ cd ~
malikarumi@Tetuoan2:~$ python smartgit.py
sh: 1: bin/smartgit.sh: not found

也不是这个:

malikarumi@Tetuoan2:~$ python smartgit.py
sudo: bin/smartgit.sh: command not found

有效,但我不明白为什么,因为:

malikarumi@Tetuoan2:~$ cd Downloads/smartgit
malikarumi@Tetuoan2:~/Downloads/smartgit$ bin/smartgit.sh

做!

感谢您帮助我理解并修复此脚本。

答案1

cd在 Python 函数中运行命令毫无意义os.system(...),因为每个调用都会生成自己的独立 shell,命令会在其中运行,这不会影响主进程或其他函数调用的 shell。因此,cd一个调用不会影响其他调用的工作目录。

您可以使用os.chdir(...)而是改变整个 Python 进程的工作目录。

但是,您不应该在应用程序中依赖此类隐式相对路径,如果您从主目录以外的任何其他位置运行脚本,这将中断。也许您想在路径前加上前缀,使其~/相对于您的主目录。

答案2

os.system()启动 shell,执行命令,然后关闭该 shell。 的cd效果将丢失。使用 Python 更改目录本身:

os.chdir("Downloads/smartgit")
subprocess.call(["bin/smargit.sh"])

更好的是,那chdir为什么不直接调用脚本呢:

smartgit_path = os.path.expanduser("~/Download/smartgit/bin/smartgit.sh")
subprocess.call([smartgit_path])

答案3

如果您使用 Python 所做的只是调用 shell 命令,那为什么要使用它呢?一个简单的 shell 脚本就可以更轻松地完成此操作,并且只要您的大多数 Python 命令都使用os.system模块,那么subprocess您基本上就是将 shell 脚本包装在 Python 程序中(存在其他缺陷),这无论如何都需要您学习一些 shell 脚本。

以下是使用 shell 脚本实现相同功能的方法(据我所知):

#!/bin/sh
cd Downloads/smartgit
bin/smargit.sh

或者更简单地说:

Downloads/smartgit/bin/smargit.sh

相关内容