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

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

crux是我的/home/目录中存在的一个程序,如果我把命令crux tide-index键入一个终端,它似乎正常工作。
当我运行Python脚本时,它到达上面的行,然后将该行输出到stderr(即,它显示在终端的输出中):
sh: 1: crux not found
我不明白为什么我可以在终端中运行命令,但不能在Python脚本中运行。我有什么遗漏吗?crux在我的/home/文件夹中可能是问题所在吗?

最佳答案

可能的原因
有几个原因可以在终端中运行,但不能在Python脚本中运行。
它可以定义为别名。
如果您的alias crux=~/crux中有.bashrc或类似内容,这将解释问题。
它可以定义为一个函数。
crux() { ~/crux "$@"; }是启动可执行文件的shell函数的示例。但是,与其他任何函数一样,这是定义它的shell的本地函数。(Bash有“导出的函数”,但这些函数在POSIX sh中不可用,您无论如何都需要使用它们)。
在交互式CLI和脚本之间可以有不同的路径。
如果shell的点文件中有crux文件,则会将主目录添加到搜索新可执行文件的位置。它本身将被导出到子进程中,因此由Python中由PATH=$PATH:$HOME启动的/bin/sh实例进行搜索——但是如果脚本是由os.system()或其他服务启动的,则不会进行路径更新。
调试
在交互式shell中运行cron。输出形式如下:
type crux意味着它只能在交互式shell中使用别名。更新路径以包含crux is aliased to `/home/kestrel/crux',或者修改Python脚本以完全限定脚本的位置。
…或者如果你得到:

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

…它的意思就是:/home/kestrel是一个反过来调用crux的函数。然后可以直接将/home/kestrel/crux放入Python脚本中。
…或者如果你得到:
crux is hashed (/home/kestrel/crux)


crux is /home/kestrel/crux

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

关于python - python os.system问题:“sh:1:[command] not found”;命令交互工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42677066/

10-11 02:54