我正在尝试从Python运行系统调用。我有一行在我的Python脚本中读取它:
return os.system("crux tide-index")
crux
是我/home/
目录中存在的程序,如果我在终端中键入命令crux tide-index
,它似乎正常工作。
当我运行我的Python脚本时,它到达上面的行,然后将此行输出到stderr(即它显示在我的终端的输出中):
sh: 1: crux not found
我不明白为什么我可以在终端中运行命令,但不能在Python脚本中运行。有什么我想念的吗?我crux
文件夹中的/home/
可能是问题吗?
答案 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 中使用 关键点的绝对路径 而不是 关键点。