运行subprocess.call会导致错误

时间:2018-07-05 16:44:06

标签: python shell

运行subprocess.call()函数时出现以下错误。

error: must set personality to get -x option

我有如下的shell脚本test.sh

#!/bin/bash
$1 >  $2

下面是我的python代码

action_path = '/home/test.sh'
val1 = 'ps -ax | grep python'
val2 = '/home/cvg/cvg.log'
retval=subprocess.call([action_path,val1,val2])

我希望命令'ps -ax | grep python'的输出应该记录到提到的文件中。但是我得到的文件为空白, 开始时提到的错误。虽然我可以在运行python进程输出列表的终端上成功运行此命令。 我对此没有任何线索。 请让我知道是否有人知道。

2 个答案:

答案 0 :(得分:1)

顺便说一句-grep遍历ps是错误的形式;通常,您根本不应该这样做,并且如果您想通过Python进行操作,the psutil module将为您完成工作。

此问题的核心是BashFAQ #50。诸如$1之类的无引号扩展(出于非常好的与安全性相关的原因)不会经过完整的shell解析步骤-引号,重定向,管道,命令替换和其他语法元素通常无法识别;仅进行字符串拆分和全局扩展。


还请注意,以下所有内容均要求您修复ps命令,以使其在本地平台上运行时才能正常工作-针对以Python为中心的问题的修正范围,尤其是未使用特定操作系统标记的操作系统,因此我们可以查询其ps命令的用法。

修复Python

根本没有中间的外壳脚本 。让您的Python代码直接打开输出文件。

subprocess.call('ps -ax | grep python', shell=True, stdout=open('/home/cvg/cvg.log', 'w'))

...或者,如果您真的希望您的输出文件由外壳打开:

subprocess.call(['ps -ax | grep python >"$1"', '_', '/home/cvg/cvg.log'], shell=True)

请注意,当传递subprocess.call()的列表时,第一个列表元素是要运行的脚本。第二个是$0,第三个是$1,依此类推;因此,_$0的占位符,文件名在脚本的上下文中变为$1

通过Shell脚本修复此问题

您可以让解释器在内部评估重定向:

#!/bin/sh
eval "$1" >"$2"

或者效率更低,在重定向本身之后让它启动一个新的shell(但是为什么不让Python这样做呢?):

#!/bin/sh
sh -c "$1" >"$2"

答案 1 :(得分:0)

ps -ax替换为ps -ef

来自$ man ps

  

要使用标准语法查看系统上的每个进程:

ps -e        
ps -ef
ps -eF
ps -ely