Python 运行subprocess.call会导致错误
运行subprocess.call()函数时出现以下错误Python 运行subprocess.call会导致错误,python,shell,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
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进程列表的终端上成功地运行这个命令。
我对此一无所知。
如果有人知道,请告诉我。将
ps-ax
替换为ps-ef
从$man ps
:
要使用标准语法查看系统上的每个进程,请执行以下操作:
ps -e
ps -ef
ps -eF
ps -ely
另一方面--grep
ping通过ps
是不好的形式;一般来说,您根本不应该这样做,如果您真的想从Python中完成这项工作,我们将为您完成这项工作
这个问题的核心是。像$1
(出于非常好的安全相关原因)这样的未加引号的扩展没有经过所有shell解析步骤——引号、重定向、管道、命令替换和其他语法元素通常无法识别;仅发生字符串拆分和全局扩展
还要注意的是,下面所有内容都要求您修复
ps
命令,使其在本地平台上运行时能够实际工作——这是对一个以Python为中心的问题的纠正,特别是没有标记特定操作系统的问题,因此我们可以查看其ps
命令的用法
修复Python
根本没有理由使用中间shell脚本。让Python代码直接打开输出文件
subprocess.call('ps -ax | grep python', shell=True, stdout=open('/home/cvg/cvg.log', 'w'))
…或者,如果您确实希望shell打开输出文件:
subprocess.call(['ps -ax | grep python >"$1"', '_', '/home/cvg/cvg.log'], shell=True)
请注意,当subprocess.call()
被传递一个列表时,第一个列表元素是要运行的脚本;第二个是$0
,第三个是$1
,等等;因此,\uu
是$0
的占位符,文件名在脚本上下文中变为$1
从Shell脚本修复此问题
您可以让解释器在内部评估重定向:
#!/bin/sh
eval "$1" >"$2"
或者,效率更低的是,让它在重定向本身之后启动一个新的shell(但为什么不让Python这样做呢?)
这还不足以解决这个问题——OP的代码将相当于运行
'ps'-ax'.''grep''python'
;将其更改为-ef
并不能解决更大的问题,因为|
被视为文字而不是语法。我建议阅读,描述为什么存储在变量中的命令的行为不符合您的预期。@mannu\u,您想知道如何最好地将任意shell命令的输出重定向到具有subprocess.call()
的文件吗?你在这里的真正目标是什么?(如果这是您想要的,subprocess.call('ps-ax | grep python',shell=True,stdout=open('/home/cvg/cvg.log','w'))
就可以了。
#!/bin/sh
sh -c "$1" >"$2"