Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 运行subprocess.call会导致错误_Python_Shell - Fatal编程技术网

Python 运行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

运行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进程列表的终端上成功地运行这个命令。 我对此一无所知。
如果有人知道,请告诉我。

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"