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

为什么从Python内部调用某些Unix命令时无法工作?(未找到命令),python,shell,unix,command,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 "l

我经常希望从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中不起作用?我尝试过使用“操作系统”和“子流程”模块,但都没有成功。有人知道还有其他模块或方法可以让我从Python内部成功调用这些命令吗?

这是因为有些shell命令实际上不是程序,而是内部shell命令

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

大致来说,有两种类型的内部shell命令:

  • 为了提高效率,由shell实现的命令,但它仍然作为一个独立程序存在:
    true
    false
    test
    sleep
  • 更改shell环境的命令,因此无法从子进程执行:
    cd
    umask
    setenv
    ulimit
  • 第一类中的命令非常特定于shell。第二类中的命令并不多

    有关详细信息,请参见相关shell的手册页(例如
    manbash

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

    $ type -a <command>
    
    将显示您的命令是否作为外部程序存在,但它对shell内部一无所知

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

    关于您的特定命令:

    • 环境(
      setenv
      getenv
      )可以通过
      os.environ
      os.getenv
      os.putenv
      等进行操作
    • 有关流程限制(
      限制
      ),请查看模块

    不在第2组中的命令可以通过执行shell本身并在shell相关参数中传递所需的命令来发出。对于tcsh来说“-c”似乎很有希望。@guidot:是的,他们可以,但这可能不会达到你的目的。想想
    os.system('sh-cdtmp')
    ,它将改变子进程的环境,但父进程将保持不变。有一种解决方案是找到并调用等价的系统调用:如果它已经被python包装,只需调用它;如果没有,您将不得不编写一个C模块来完成这项工作)。
    $ which -a <command>