我试图从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/