3

我经常希望从 Python 内部执行 Unix 命令,但我最近发现有些命令找不到。一个例子是“限制”命令:

$ 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 内部成功调用这些命令吗?

4

1 回答 1

8

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

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

粗略地说,有两种类型的内部 shell 命令:

  1. 为了效率而由 shell 实现的命令,但它仍然作为独立程序存在:true, false, test, sleep...
  2. 改变 shell 环境的命令,因此不能从子进程中完成:cd, umask, setenv, ulimit...

第一类中的命令是特定于 shell 的。第二类的命令,不多。

有关详细信息,请参阅相关 shell 的手册页(man bash例如)。

如果您想了解特定命令运行:

$ type -a <command>

类型是bashism,我不知道 tcsh 中的等价物,但which它是一个外部程序,所以这个:

$ which -a <command>

将显示您的命令是否作为外部程序存在,但它对 shell 内部结构一无所知。

如果您需要 Python 程序中的内部命令(上述类型 2)的功能,则需要使用相关的系统调用。希望它已经在某些模块中可用。如果没有,您将需要用 C 编写自己的包装器。

关于您的特定命令:

  • 环境 ( setenvand getenv) 可以使用os.environor os.getenv,os.putenv等来操作。
  • 对于进程限制 ( limit),请查看资源模块。
于 2013-01-30T10:21:51.337 回答