python 操作系统系统问题 : "sh: 1: [command] not found"; command works interactively

标签 python bash

我正在尝试从 Python 运行系统调用。我的 Python 脚本中有这样一行:

return os.system("crux tide-index")

crux 是一个存在于我的 /home/ 目录中的程序,如果我在终端中输入命令 crux tide-index,它似乎工作正常。

当我运行我的 Python 脚本时,它到达上面的行,然后将此行输出到 stderr(即它显示在我的终端的输出中):

sh: 1: 找不到关键点

我不明白为什么我可以在终端中运行命令,但不能在 Python 脚本中运行。有什么我想念的吗? crux 在我的 /home/ 文件夹中可能是问题所在吗?

最佳答案

可能的原因

您可以在终端而不是 Python 脚本中运行它的原因有多种。

  • 可以定义为别名。

    如果您的 .bashrc 或类似文件中有 alias crux=~/crux,则可以解释问题。

  • 它可以被定义为一个函数。

    crux() { ~/crux "$@"; 是启动 crux 可执行文件的 shell 函数示例。但是,与任何其他函数一样,它在定义它的 shell 中是本地的。 (Bash 具有“导出函数”,但这些在 POSIX sh 中不可用,无论如何您都需要不厌其烦地使用它们)。

  • 您可以在交互式 CLI 和脚本之间使用不同的 PATH。

    如果您的 shell 点文件中有 PATH=$PATH:$HOME,这会将您的主目录添加到搜索新可执行文件的位置。就其本身而言,此导出到子进程,因此由 os.system() 在 Python 中启动的 /bin/sh 实例进行搜索-- 但如果您的脚本是由 cron 或其他服务启动的,则它不会更新该 PATH。

调试

在交互式 shell 中运行 type crux。输出将采用以下形式之一:

  • crux 的别名是 `/home/kestrel/crux' 意味着它只能在您的交互式 shell 中工作,因为别名。更新您的 PATH 以包含 /home/kestrel,或修改您的 Python 脚本以完全限定脚本的位置。
  • ...或者如果您得到:

    crux is a function
    crux ()
    {
        /home/kestrel/crux "$@"
    }
    

    ...它的意思正是它所说的:crux 是一个函数,它依次调用 /home/kestrel/crux。然后,您可以将 /home/kestrel/crux 直接放入您的 Python 脚本中。

  • ...或者如果您遇到以下情况之一:

    crux is hashed (/home/kestrel/crux)
    

    crux is /home/kestrel/crux
    

    then crux 直接位于交互式命令提示符的 PATH 中,但不用于 Python 脚本。适本地编辑与您的脚本关联的 PATH。

关于python 操作系统系统问题 : "sh: 1: [command] not found"; command works interactively,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42677066/

相关文章:

python - Tkinter - 在文本小部件中记录文本

python - 从bash或python检测当前鼠标光标类型的方法

linux - 我怎样才能在bash shell脚本中编写这种for循环?

r - 指定在 R 中使用哪个 shell

linux - 获取从 find 命令到变量的路径

bash - 创建文本文件并使用 bash 填充它

python - 随机播放按行聚合的列表字典

python - 使用变量评估数据框列中的字符串

python - 规则定义中 "threads"通配符的算术运算

bash - 在一行 bash 脚本中打印出 5 个字符