python os.system问题:“sh:1:[命令]未找到”;命令以交互方式工作

2024-05-14 18:50:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从Python运行一个系统调用。我的Python脚本中有一行这样写道:

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

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

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

sh: 1: crux not found

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


Tags: 命令程序目录脚本终端homeindex键入
1条回答
网友
1楼 · 发布于 2024-05-14 18:50:53

可能原因

有几个原因可以在终端中运行,但不能在Python脚本中运行。

  • 它可以定义为别名。

    如果你的.bashrc中有alias crux=~/crux或者类似的内容,那就可以解释这个问题了。

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

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

  • 在交互式CLI和脚本之间可以有不同的路径。

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

调试

在交互式shell中运行type crux。输出形式如下:

  • crux is aliased to `/home/kestrel/crux'意味着它只能在交互式shell中由于别名而工作。更新路径以包含/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
    

    然后crux直接位于交互式命令提示符的路径中,而不是Python脚本的路径中。适当编辑与脚本关联的路径。

相关问题 更多 >

    热门问题