为什么从Python内部调用时某些Unix命令不起作用? (没有找到指令)

时间:2013-01-30 10:02:48

标签: python shell unix command

我经常希望从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 个答案:

答案 0 :(得分:8)

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

经典的例子是cd:如果是外部程序,它将改变新进程的当前目录,而不是shell的目录,因此它不能是外部程序。

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

  1. 由shell实现的命令,但它仍然作为独立程序存在:truefalsetestsleep ... < / LI>
  2. 更改shell环境的命令,因此无法从子进程执行:cdumasksetenvulimit ...
  3. 第一类中的命令非常特定于shell。第二类中的命令,不是那么多。

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

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

    $ type -a <command>
    

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

    $ which -a <command>
    

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

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

    关于您的具体命令:

    • 环境(setenvgetenv)可以使用os.environos.getenvos.putenv等进行操作。
    • 有关流程限制(limit),请查看resource模块。