python os.system问题:“sh:1:[command] not found”;命令以交互方式工作

时间:2017-03-08 16:44:50

标签: python bash

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

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

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

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

sh: 1: crux not found

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

2 个答案:

答案 0 :(得分:3)

可能的原因

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

  • 可以将其定义为别名。

    如果alias crux=~/crux或类似内容中有.bashrc,则可以解释此问题。

  • 可以将其定义为函数。

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

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

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

调试

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

  • type crux表示仅由于别名而在交互式shell中起作用。更新您的PATH以包含crux is aliased to `/home/kestrel/crux',或修改您的Python脚本以完全限定脚本的位置。
  • ......或者如果你得到:

    /home/kestrel

    ...它的含义正是如此:crux is a function crux () { /home/kestrel/crux "$@" } 是一个函数,反过来调用crux。然后,您可以将/home/kestrel/crux直接放在Python脚本中。

  • ...或者如果你得到以下任何一个:

    /home/kestrel/crux

    crux is hashed (/home/kestrel/crux)
    

    然后crux is /home/kestrel/crux 直接在您的交互式命令提示符的PATH中,但不在您的Python脚本中。适当地编辑与脚本关联的PATH。

答案 1 :(得分:0)

这是因为 PyCharm 的 os.system 没有加载 bashrc 的 env 变量值,除非您在终端中启动 Pycharm 并且不退出。 因此,您应该在终端中手动尝试以下命令以获取关键点的绝对路径: whereis crux 然后在 PyCharm 中使用 关键点的绝对路径 而不是 关键点