为什么某些Unix命令在Python内部调用时无法工作?(找不到命令)

3 投票
1 回答
2855 浏览
提问于 2025-04-17 14:10

我经常想在Python里面执行Unix命令,但最近发现有些命令找不到。例如,'limit'这个命令:

$ echo $SHELL
/bin/tcsh
$ limit vmemoryuse 1000m
$ python
Python 2.7.3 (default, Aug  3 2012, 20:09:51) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-50)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.system("echo $SHELL")
/bin/tcsh
0
>>> os.system("limit vmemoryuse 1000m")
sh: limit: command not found
32512
>>>

还有一个例子是'setenv'命令。为什么这些命令在Python里面不能用呢?我试过用'os'和'subprocess'这两个模块,但都没有成功。有没有人知道其他的模块或者方法,可以让我在Python里面成功调用这些命令呢?

1 个回答

8

这是因为有些命令并不是真正的程序,而是内部的 shell 命令。

一个经典的例子就是 cd:如果它是一个外部程序,它只会改变新进程的当前目录,而不会改变 shell 的当前目录,所以它不能是外部程序。

大致来说,内部 shell 命令可以分为两种类型:

  1. 为了效率,shell 自己实现的命令,但它仍然可以作为独立程序存在,比如 truefalsetestsleep 等等。
  2. 会改变 shell 环境的命令,因此不能在子进程中执行,比如 cdumasksetenvulimit 等等。

第一类命令比较特定于某个 shell,而第二类命令就不那么特定了。

想了解更多细节,可以查看相关 shell 的手册页(比如输入 man bash)。

如果你想了解某个具体命令,可以运行:

$ type -a <command>

Type 是一个 bashism,我不知道在 tcsh 中的对应命令是什么,但 which 是一个外部程序,所以这个:

$ which -a <command>

会告诉你你的命令是否作为外部程序存在,但它对 shell 的内部情况一无所知。

如果你在 Python 程序中需要内部命令(上面提到的第二类)的功能,你需要使用相关的系统调用。希望这些功能已经在某个模块中可用。如果没有,你就需要用 C 语言自己写一个封装。

关于你提到的具体命令:

  • 环境变量(setenvgetenv)可以通过 os.environos.getenvos.putenv 等来操作。
  • 关于进程限制(limit),可以查看 resource 模块。

撰写回答