我正在尝试从 Python 运行系统调用。我的 Python 脚本中有这样一行:
return os.system("crux tide-index")
crux
是一个存在于我的 /home/
目录中的程序,如果我在终端中输入命令 crux tide-index
,它似乎工作正常。
当我运行我的 Python 脚本时,它到达上面的行,然后将此行输出到 stderr(即它显示在我的终端的输出中):
sh: 1: 找不到关键点
我不明白为什么我可以在终端中运行命令,但不能在 Python 脚本中运行。有什么我想念的吗? crux
在我的 /home/
文件夹中可能是问题所在吗?
最佳答案
可能的原因
您可以在终端而不是 Python 脚本中运行它的原因有多种。
可以定义为别名。
如果您的
.bashrc
或类似文件中有alias crux=~/crux
,则可以解释问题。它可以被定义为一个函数。
crux() { ~/crux "$@";
是启动crux
可执行文件的 shell 函数示例。但是,与任何其他函数一样,它在定义它的 shell 中是本地的。 (Bash 具有“导出函数”,但这些在 POSIX sh 中不可用,无论如何您都需要不厌其烦地使用它们)。您可以在交互式 CLI 和脚本之间使用不同的 PATH。
如果您的 shell 点文件中有
PATH=$PATH:$HOME
,这会将您的主目录添加到搜索新可执行文件的位置。就其本身而言,此将导出到子进程,因此由os.system()
在 Python 中启动的/bin/sh
实例进行搜索-- 但如果您的脚本是由cron
或其他服务启动的,则它不会更新该 PATH。
调试
在交互式 shell 中运行 type crux
。输出将采用以下形式之一:
crux 的别名是 `/home/kestrel/crux'
意味着它只能在您的交互式 shell 中工作,因为别名。更新您的 PATH 以包含/home/kestrel
,或修改您的 Python 脚本以完全限定脚本的位置。...或者如果您得到:
crux is a function crux () { /home/kestrel/crux "$@" }
...它的意思正是它所说的:
crux
是一个函数,它依次调用/home/kestrel/crux
。然后,您可以将/home/kestrel/crux
直接放入您的 Python 脚本中。...或者如果您遇到以下情况之一:
crux is hashed (/home/kestrel/crux)
或
crux is /home/kestrel/crux
then
crux
直接位于交互式命令提示符的 PATH 中,但不用于 Python 脚本。适本地编辑与您的脚本关联的 PATH。
关于python 操作系统系统问题 : "sh: 1: [command] not found"; command works interactively,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42677066/