运行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进程输出列表的终端上成功运行此命令。
我对此没有任何线索。
请让我知道是否有人知道。
答案 0 :(得分:1)
顺便说一句-grep
遍历ps
是错误的形式;通常,您根本不应该这样做,并且如果您想通过Python进行操作,the psutil
module将为您完成工作。
此问题的核心是BashFAQ #50。诸如$1
之类的无引号扩展(出于非常好的与安全性相关的原因)不会经过完整的shell解析步骤-引号,重定向,管道,命令替换和其他语法元素通常无法识别;仅进行字符串拆分和全局扩展。
还请注意,以下所有内容均要求您修复ps
命令,以使其在本地平台上运行时才能正常工作-针对以Python为中心的问题的修正范围,尤其是未使用特定操作系统标记的操作系统,因此我们可以查询其ps
命令的用法。
根本没有中间的外壳脚本 。让您的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
。
您可以让解释器在内部评估重定向:
#!/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