我试图从Python运行一个系统调用。我的Python脚本中有一行这样写道:
return os.system("crux tide-index")
crux
是存在于我的/home/
目录中的程序,如果我在终端中键入命令crux tide-index
,它似乎可以正常工作。
当我运行Python脚本时,它到达上面的行,然后将该行输出到stderr(即,它显示在终端的输出中):
sh: 1: crux not found
我不明白为什么我可以在终端中运行命令,但不能在Python脚本中运行。我有什么遗漏吗?我的crux
文件夹中的/home/
可能是问题所在吗?
可能原因
有几个原因可以在终端中运行,但不能在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
是一个反过来调用/home/kestrel/crux
的函数。然后,可以将/home/kestrel/crux
直接放入Python脚本中。…或者如果你得到:
或者
然后
crux
直接位于交互式命令提示符的路径中,而不是Python脚本的路径中。适当编辑与脚本关联的路径。相关问题 更多 >
编程相关推荐