为什么从Python内部调用某些Unix命令时无法工作?(未找到命令)
我经常希望从Python内部执行Unix命令,但最近我发现有些命令找不到。“limit”命令就是一个例子:为什么从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
$ 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命令:
true
,false
,test
,sleep
cd
,umask
,setenv
,ulimit
manbash
)
如果您想了解特定的命令运行:
$ type -a <command>
将显示您的命令是否作为外部程序存在,但它对shell内部一无所知
如果在Python程序中需要内部命令(上面的类型2)的功能,则需要使用相关的系统调用。希望它已经在某些模块中可用。否则,您需要用C编写自己的包装器
关于您的特定命令:
- 环境(
和setenv
)可以通过getenv
或os.environ
,os.getenv
等进行操作os.putenv
- 有关流程限制(
),请查看模块限制
os.system('sh-cdtmp')
,它将改变子进程的环境,但父进程将保持不变。有一种解决方案是找到并调用等价的系统调用:如果它已经被python包装,只需调用它;如果没有,您将不得不编写一个C模块来完成这项工作)。
$ which -a <command>