我正在尝试从 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 函数的示例crux
可执行的。然而,与任何其他函数一样,这是定义它的 shell 的本地函数。 (Bash 有“导出函数”,但这些在 POSIX sh 中不可用,无论如何你都需要不遗余力地使用它们)。
-
您的交互式 CLI 和脚本之间可以有不同的 PATH。
如果你有PATH=$PATH:$HOME
在 shell 的点文件中的某个位置,这会将您的主目录添加到搜索新可执行文件的位置。就其本身而言,这will被导出到子流程,因此由/bin/sh
实例启动于os.system()
在 Python 中——但是如果你的脚本是由cron
或其他服务,它不会有该 PATH 更新。
调试
Run type crux
在您的交互式 shell 中。输出将采用以下形式之一:
-
crux is aliased to `/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)
or
crux is /home/kestrel/crux
then crux
直接位于交互式命令提示符的 PATH 中,但不位于 Python 脚本的 PATH 中。适当编辑与脚本关联的路径。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)